We currently use ThreadPoolExecutor to clone repos in parallel, but when a failure is encountered we still need to wait for all active threads to terminate naturally. If we switch to ProcessPoolExecutor instead, we can send kill signals to all active threads and cause the job to immediately quit.
Let's also keep this distinction in mind when building any other types of parallelism into Quibble.