Improve C++ exception handling.

We now allocate extra bytes before the exception data and use that,
rather than globals, to store the exception type and destructor
information.  This is step one towards having multiple exceptions
in flight at once.

We also track what exceptions are currently being caught in a stack
maintained in __cxa_begin_catch and __cxa_end_catch. This is used
for ensuring that we handle nested exception catch blocks correctly.