Add parallelization.
Use a couple of simple shell constructs to monitor the number of jobs
running at any given time and if we exceed the maximum (based on CPUs
since this is a CPU bound process), we sleep and recheck if any of our
children have finished.