It turns out that prior to running pthread tls destructors, the
current value stored under the given key is set to NULL, so any
attempt to retrieve the key value in the destructor (yes, it is passed
in as an argument, but...subroutines) yields a NULL.  This is now
worked around by setting the key value anew in the destructor, then
setting it back to NULL prior to exit.

Also fixed a bug where the uma tls destructor would have tried to
drain the local caches with a NULL zone pointer due to being called
before the first allocation by that thread in the given zone.