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.
4 jobs for adinapoli/issue-392 in 51 minutes and 45 seconds (queued for 3 seconds)
Status Job ID Name Coverage
  Cabal
passed #14552
cabal

00:19:28

 
  Stack
passed #14553
stack

00:04:59

 
  Bench
manual #14554
allowed to fail manual
bench
 
  Test
passed #14555
test

00:27:17