This class does all the hard work of building and maintaining the state of the message
dispatchers so that concrete implementations only need to focus on dispatching the messages.
Different types of dispatchers are created based on whether or not the module is using aggregation.
Asynchronous dispatchers use a queue and a thread pool to delegate to a suitable synchronous dispatcher.