Separate out the 'DomainWatch' logic from the source of events

When running as a server, we bind the VIRQ_DOM_EXC (see
kernelspace/vIRQ_DOM_EXC.ml) and generate a stream of () events.

When running as a client, we will watch @introduceDomain and
@releaseDomain paths and generate a stream of () events.

In both cases we share the code to list the running domains and
create a stream of high-level `Created domid | `Destroyed domid
events.

Signed-off-by: David Scott <dave.scott@citrix.com>