Commit manager code used locks in such a way that if two events wanted
to commit to the same state, then no other event would be able to
commit to any other data.  This was because, to commit, an
invalidation listener would have to take the global lock on the commit
manager and then try to acquire, sequentially, each touched object's
lock.

The purpose of this global lock was to ensure that we couldn't get
deadlock on a single host from trying to acquire commit locks on each
separate waldo reference.

This commit takes a different approach.  Instead of a global commit
lock, this commit orders objects by their uuids when trying to
commit.  Because all invalidation listeners acquire locks in the same
order, there cannot be deadlock.
Added code to begin forwarding commit holds on to root endpoints.
Still must test it.  Also, must fill in RootActiveEvent's handling
function for these messages (to detect deadlock).
Forwarding on messages for first and second phases of commit.  Also
forwarding messages for deadlock detection (however, have not updated
logic to actually check for and handle deadlock).  Still need code to
reschedule an event after we back it out.  Similarly, still need a lot
of testing.
Added test code for straightforward, non-conflicting, non-deadlock changes to peered data.