Fix closure binding, make recursion easier to add

The expressions passed to the closure were not being evaluated in the
correct environment; should have been the calling environment, not the
one associated with the closure when it was instantiated.

Add support for additional tail recursive procedures by introducing a
tail recursive function type which the derived expressions that
support proper tail recursion can implement.

Tests pass