Change tail call elimination implementation

Improve the implementation somewhat to be able to perform tail call
elimination when applying procedures.  The previous code could do
that only for procedures which called themselves recursively.

This changes the previous TailRecursion exception class to a TailCall
class, which can be raised before a procedure evaluates its last
expression.  Some tests are added to verify the functionality, but it
is still very limited and special forms should be handled too.
Add tail call elimination support to 'cond'

The special form 'cond' can now raise a TailCall to support tail call
eliminination.