First half of Chapter 11.

Builtins as function pointers.
def now works for variables. wee!
"improved" error handling.

Not really happy about how verbose the book's error handling is. Going
to go back and clean this up.
Adding bonus typecheck macros.

Also renaming LASSERT to LCHECK since I feel "assert" is being mis-used
here.
Add function name printing
Adding 'env' function to print environment.

Slightly odd semantics because language doesn't allow for zero argument
functions. I opted for env taking a list, which if empty returns all
variables, but if symbols are passed, prints out those symbols.

I had also implemented a zero argument version, but that limits the
ability for passing functions around - not sure if this will be useful
later or not, so I've opted for this implementation.
Adding an exit function.

This has slightly different semantics than just hitting CTRL-D (which
ends the REPL and cleanly exits).

This exit function evaluates it's parameters then immediately exits
without any cleanup. The idea here is that it could be used like an
abort or exception in our language when we just want to bail as fast as
possible.