Needed to make a major change in the representation of the environment.
This was in order to support lambdas that can effect common variables.
The new representation is a stack. The stack is copied when a function
is defined and a new frame is created when a function is called. The new
frame initially only contain the arguments to the function.
Cleaned up variable assignment/definition and retrieval.
Refactored the 'make_call' function in order to divide it's responsibilities.

Unsure if the function and it's subfunctions should be further refined.