Cleanup transition after end.

Previously, the transition would delete itself prior to notifying any  end event
listeners. This could cause a crash when trying to schedule a chained transition
when a transition ends. To fix this, we now defer the deletion of the transition
until after the end event is dispatch.

This commit also makes a few tests that depended on the order in which tweens
were invoked a little more robust: the state after a transition ends is
inspected in the next tick after, rather than during, the end event.
Defer persistence until transition start.

The zoom behavior was immediately persisting the new view when the transition
was scheduled, rather than waiting until the transition started. By waiting
until the transition starts, it’s possible to schedule chained transitions to
different views.