Get rid of an intermediary on the stack
Make ifs and asserts tail-recursive

The local Value object prevented g++ from making a tail call.  Not
clear why.  In any case, not using a temporary makes g++ do the tail
call.
Make function calls tail-recursive
Add a test to check that tail calls run in bounded stack space
Make function calls show up in stack traces again

Note that adding --show-trace prevents functions calls from being
tail-recursive, so an expression that evaluates without --show-trace
may fail with a stack overflow if --show-trace is given.