Store watch events in a persistent queue

Watch events should not be lost, otherwise clients will block forever. Therefore we store them in a persistent queue before acknowledging the request that produced them.

NB in the case of transactions we don't need to store these watches because we can simply return 'abort' to a transaction commit and rely on the client to resubmit.