Complete refactor of function call evaluation. It is much more compact now.

There is a bug that was introduced when I started passing owned Env's instead of
references to Env, in that function calls mutate the environment but do not clean
up afterwards. Since I think this was introduced in a previous revision, I will
commit this for now.