Added a ThreadPoolExecutorDispatcher constructor with Executor argument

There are many reasons we want to use a custom executor, e.g. use our own UncaughtExceptionHandler, share thread pool, use other thread naming, monitor the runnable queue etc.

This will address issue #110 as well.