Implement vector eval and fix function apply

I've implemented vectors by having another kind of continuation that
mutates the input value. Possibly it would be better to set up a
primcall instead -- mutating the input seems a bit dodgy (e.g., what
if it was done during `(eval ...)`?)

Another option would be to parse `[a b]` as `(vector a b)`, and simply
have vector as a primitive. This makes it more of a reader macro, and
the meaning could be changed. Which might be weird.
Better treatment for lambda bodies
Add and rearrange tests
Treat the call stack as GC roots too
Tidy up stack operations

Factor the stack operations out and make sure the environment is
stored and restored.