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
I haven't thought this through, but wouldn't `@trusted` be problematic for types that have, say, a `@system` postblit or destructor?