Make extra data used for queries generic instead of just Zernike descriptors.

Change all interfaces to pass around a generic string to use as extra
data to use in the per-node data, both for building the tree and
performing queries. Also add missing state tracking and events for this data --
Zernike descriptors previously could not be updated.
Add custom query data support.

Add support for custom query data passed into queries and utilized by
query handlers. For the built-in classes, this adds no real cost, but
other implementations can now use their own subclasses of Query which
receive notifications of custom query data strings. Query handlers
must know how to extract this information, but that is usually simple
since they allocate the custom query classes.

Other than the basic changes to Query and QueryHandler classes, this
just adds the hooks to pass this information and updates about it
through the system, in QueryChangeListener, the RTree implementatio,
and AggregateListener. Support already existed in
LocationServiceCache. Finally, it updates the test and proxsim code
to handle these new interfaces.
Proactively recompute bounds after inserting new node.
Fix updateObj implementations to handle updating internal nodes.

Some of the updateObj implementations were not complete. They only
handled leaf objects, but for replicated trees they should also update
internal nodes.
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.
Expose the root aggregate ID from the Aggregator interface.