Keep track of which thread-local contexts have been initialized
If you have two threads that are run in parallel, and the the module is
first loaded in one and then in the other, then our check functions might
be called in the second thread before the module's boot function is
executed. This is bad because the boot function is needed to initialize the
thread-local context, and this context is needed by the check functions.
To fix this, we keep track of which contexts were initialized thanks to a
refcounted pointer table.