std.variant unions cannot have postblit or destructors or invariants

Destructors, postblits, and invariants are not allowed in unions, as they are unsafe because they may be run on differently typed data. std.variant has these, so a workaround is necessary.

This is a blocker for https://github.com/D-Programming-Language/dmd/pull/4144
In my eyes, keeping the old code _after_ this makes the function actually harder to read. At the very least, please consider using `version (none)` so that the explanatory code comes before the actually used branch. But I'd personally much prefer just having a simple comment, as it doesn't suggest visual structure where there is none. Something like:

```d
// handler(OpID.get, …) expects the TypeInfo for T in the same buffer it
// writes the result to afterwards. Because T might have a non-trivial
// destructor, postblit or invariant, we cannot use a union.
```