Event.next: improve performance

We
- only generate snapshots if the user calls 'next' (previously we did it on every database write, irrespective of event system used, irrespective even of class -- even sessions were being snapshotted)
- capture database references in the queue, where each reference shares most of the data with other database references.

This is a generalisation of the idea of storing a list of database deltas, with the observation that the heap usage churn between two databases is about the same size as the delta would be since the non-shared heap blocks *is* the delta (kinda)

This request includes a (disabled, but easy to re-activate) micro benchmark.

Outstanding issues:
- in the case of xenstore_data, there currently won't be any sharing of the xenstore_data field itself, because each one appears as a fresh set of strings. Is this a problem?