Rework ReactorTaskExecutor to be DispatcherTaskExecutor

Using a Reactor for task execution introduces some unnecessary
overhead: the task is executed by notifying the reactor of an event,
the notification being matched using a selector to a consumer, and a
Dispatcher being used to dispatch the event to the consumer. A lot of
this processing can be eliminated by using a Dispatcher directly.

Using a Dispatcher directly is not quite as easy as I'd like. A lot
of the types involved in the above processing are exposed by
the Dispatcher.dispatch method so there are some hoops to jump through
to get a Dispatcher to call a Runnable's run() method. I have opened
issue #134 to explore improving this.

Completes #115