Hide the Dispatcher Task abstraction from Reactor

The use of a Task by the Dispatcher is largely a detail of the
various Dispatcher implementations, however it was leaking out into
Reactor. This meant that Reactor had to be aware of Tasks and their
mutable nature: it had to get a Task, populate it, and then submit
it for execution.

This commit makes the Task abstraction a detail of the Dispatcher
implementations, removing its use from the Dispatcher interface.
Instead, Dispatcher provides a new dispatch() method that Reactor now
uses for Event dispatching.