Add debugging output.

I've found I really needed to trace how things were being evaluated when
working on examples for Chapter 8. This tracing helps me figure out what
is going on, although it's still a bit of work.
Initial work on Chapter 8, 'Lambda the Ultimate'.

The biggest introduction here is a 'native define' function, to allow
us to define and curry lambdas in our scheme.

In order to test this effectively I needed some way to store the
result of defining new functions between the setup and spec runs. I
did this by returning the modified environment as well as the result
s_expression in a new `EvaluationResult` object, and use this to
modify the `definitions` environment that is set up before each
example.

In order to curry lambdas (i.e. evaluate

    (lambda (x) (lambda (y) (x y)))

where `x` is some value and have that be captured in a closure by
the returned compiled lambda) I also now stash the current environment
when building a `Lambda`, and then merge that when applying the lambda
during execution. It's likely that this won't be sufficient (maybe I
should `dup` the environment?), but it seems to help for now.

This is still a work in progress, but hopefully it's heading in a
reasonable direction!