Change the loop trampoline to keep loops synchronous.

It was super cute to use the microtask queue as a trampoline, but also
horribly incorrect.  Instead, use an in-loop flag and a while-loop
trampoline per loop.

The flag is set when the code is nested inside a loop in some stack
activation and is on the stack andthe code should stay in the loop.
It is cleared when the loop is not on the stack (e.g., before entering
the loop, or immediately at the point of an await) or when the loop
should be exited (e.g., via return or break or continue targeting an
outer label).