Implement the parallel upsweep

The parallel upsweep is the parallel counterpart to the default
sequential upsweep. It attempts to compile modules in parallel by
splitting the work of the upsweep into multiple Haskell threads.