Allow external clients of TraceThreadListener to access the
SupportSynchronizedExit object.

Update SynchronizedExit to allow clients to stop all threads and then abort(),
or to stop all threads and then return control to the caller (it is expected
that the caller will subsequently terminate the program).
Make TraceProcessListener store registered thread listeners as non-const
pointers, and allow clients to get a list of registered thread listeners using
the new member function getThreadListeners().
Add interception functions for abort, exit, quick_exit, _Exit, atexit, and
at_quick_exit.

We keep our own stack of callback functions for atexit and at_quick_exit, and
we manually call them in the intercepted exit and quick_exit.

All functions that terminate the process will first coordinate a thread stop
using the SynchronizedExit, then ensure that the trace is written, before
finally terminating the process.