Implement dispatcher pool

allows control over the number of threads used for dispatching and allows reuse of threads