Fix edge case in cut reparent event handling.

Fix an edge case where we could get stuck in an infinite loop with
infinitely expanding cut if the portion of a cut that needed to be
moved ended on the same element as the location it needed to be moved
to. The fix is just to ignore this case because it should be a nop.
Pass leaf object events through AggregateListener.

Add aggregateObjectCreated and aggregateObjectDestroyed events to
AggregateListener to indicate when individual leaf objects are created
and destroyed in the tree. This lets you properly reconstruct the
entire tree instead of relying on implicit information about leaf
objects. The naming is a bit unfortunate -- the prefix aggregate is to
scope the methods for AggregateListener and ObjectCreated/Destroyed
indicates we're talking about leaf objects.