Previously, had been forcing backout for all events sent to root
object that the root did not hold in its read_lock_holders.  This was
broken.  Consider the case that we have three write events running,
evt1, evt2, and evt3.  Assume evt1 acquires w lock on obj.  Then
speculate producing obj', which evt2 assumes write lock on.  Then,
evt3 waits on obj''s lock.  When evt1 completes and we transfer obj'
to obj, then we speculate on obj to produce obj'', which evt3 can then
assume write lock on.  When evt3 tries to commit, obj' is still in its
touched set and obj' forwards commit to root.  Root does not see
element in read lock holders set and forces backout.

Instead updated logic so that when root receives a request to begin
first phase commit and doesn't hold read lock, it checks if event is
in any of the derived objects, rather than just rejecting.  If it's
not in any of derived, can then return failed.  Otherwise, forward
first_phase_commit to derived element.

Note: promotion test seems to be failing because of this commit.
Investigating in next commits.