Factor the code properly.

The original design would not have handled responses well. Now,
requests include a response channel that the worker pool can
return a response via.