Add implementation of a copying garbage collector.

This is more complicated than the original malloc-based mark-and-sweep
collector. Allocate YLispValue structures from a zone array, and copy
these to a new array when performing a GC.

Because of the nature of the copy collector, we not only need to "stop
values being garbage collected", but also need to fix all YLispValue
pointers on the stack when a collection occurs. Remove the
pin_variable system and walk the raw values on the stack to find
pointers to fix.  This is evil and relies on implementation-defined
behavior, but it works. Potentially it could break in some
compilers/optimization levels if pointers are stored in registers, not
on the stack.

One other issue is that YLispValue pointers must point to the exact
start of a value structure; this means that a couple of YLispValue**
pointers used to modify fields inside the structures must be
eliminated and the corresponding code changed to work differently.