ws: make Dispatcher abstract
The `Dispatcher` type is now opaque and not exported by `.AsyncUpdates.Dispatcher`, and it has been moved out of the `.Types`. This ensures that we can make the internal record fields private, and offer accessors for things like `terminateDispatcher`. This preserve information hiding and allows us to change the internal way of terminating a dispatcher (for example switching away from normal `forkIO` in favour of `async` & co) while not breaking client's code.