start work on a new implementation of TLS

This begins the work towards a new TLS implementation. It will be useful
to have the initial work in-tree for test coverage across various
platforms and to allow for collaborative work on the API. The current
fast implementation using `#[thread_local]` is expected to work on
Linux, Windows (with #17563), OS X, FreeBSD and the current Android
version (but not the bot).

Coming up with a good API will need to wait until there's a full
implementation with destructor support (#17572) and a fallback path
(#17579) for platforms like iOS and old versions of Android. A set of 6
macros is probably not the ideal API... but it's an obvious way of
covering all of the use cases with minimal overhead.

Closes #17569
The problem is the lack of a way to initialize `RefCell` in a static variable. This code is working around that problem by doing something that's currently perfectly safe - assuming that while the `struct` representation is not defined, it will not vary for a type defined a certain way. It's hardly the only `unsafe` code relying on guarantees that are not explicitly stated anywhere.