We need Rootable as public: Scopable and Global rely on it. But we are leaking internal types like environments and promise internals through the HeapRootData enum: this is not good.
We could put HeapRootData behind a wrapper, or we could split Rootable up into a private and public trait.