I think the thread pool semantics here are more appropriate for the Glacier multipart upload implementation: This thread pool will block task submission if all threads are busy; this allows the progress of `create-archive-from-port' to be moderated such that no more than part-size*num-threads of data is buffered up from the input port at once. Using the code in pool.rkt would require either adding a semaphore/channel to moderate buffering in the task-dispatching thread or moving the port reading code into the worker threads; both add a lot of complexity.

This implementation also forwards exceptions from the worker threads to the dispatching thread.