Support reentrance and asynchronous transitions

We can't enforce it, but it's the contract. If you don't call it shit will break.