Create Executor threads on demand

Instead of keeping idle `Executor` threads all the time, create them when there's something to do, and throw them away when they are done with the build.

This saves the system resources on a large system, and it simplifies the queue code, as it needs less synchronization.

The tests do pass, but I noticed that overall test execution time went up from 30 mins to 40 mins, so there's probably still something wrong. While I investigate that bug, I'd appreciate other eyeballs.

**NOT READY TO MERGE UNTIL THE SLOW DOWN IS INVESTIGATED**