Had a bug where we'd do down a path that didn't result in calling the
nextPhase, meaning we'd end up with zero events in the queue and then
just sit there. Wasn't great.
We've mostly got this working. Events get executed in the array of
events. We don't use setTimeout anymore thankfully. I'm not in love with
this system, it still isn't straight forward about what events happen
where, but I do at least now have an ability to better control the flow.