stdlib: Implement (reverse)

This is used by one of the (dynamic-wind) examples in R7RS
compiler: Treat PushDynamicState as allocating

Pushing dynamic states now allocate an internal DynamicStateCell to
allow the GC to track the state. While codegen correctly inserted a GC
barrier the planner didn't consider PushDynamicState to be an allocating
step. It some cases it could hold a cell allocation across the barrier
which would invalidate the allocation.

This also adds an explicit check in codegen.GenGcBarrier to ensure no
live cell allocations are held across GC barriers
compiler: Add *dynamic-wind) test from R7RS

This is similar to the existing test we had for (dynamic-wind) except
this tests switching between a (dynamic-wind) and a parent state instead
of two sibling states.