Passed tests:
    "Symbols (other than #t and #f) are treated as variable references."
    "Referencing undefined variables should raise an appropriate
exception."
Passed test: "Test of simple define statement."
Passed test: "Defines should have exactly two arguments, or raise an
error"
Passed test: "Defines require the first argument to be a symbol."
Changed return value of `define` to empty string
Passed test: "Test define and lookup variable in same environment."
Evaluate expressions during `define`
Passed tests:
    "The lambda form should evaluate to a Closure"
    "The closure should keep a copy of the environment where it was
defined."
    "The closure contains the parameter list and function body too."
Passed test: "The parameters of a `lambda` should be a list."
Passed tests:
    "The `lambda` form should expect exactly two arguments."
    "The function body should not be evaluated when the lambda is
defined."
Passed test: "The first case we'll handle is when the AST is a list with
an actual closure as the first element."
Passed tests:
    "The function body must be evaluated in an environment where the
parameters are bound."
    "Call to function should evaluate all arguments."
    "The body should be evaluated in the environment from the closure."
Intermediate variable for bindings when evaluating closure with parameters
Extra type check before looking up math operators
Passed tests:
    "A call to a symbol corresponds to a call to its value in the
environment."
    "It should be possible to define and call functions directly."
    "Actually, all ASTs that are not atoms should be evaluated and then
called."
    "A function call to a non-function should result in an error."
Passed all tests of part 5