Issue 10194. Variant does not call struct destructors.

First commit fixes [issue 10194](https://issues.dlang.org/show_bug.cgi?id=10194)
The second commit adds support for elaborate copying.
If you want to check that `A` has an elaborate copy operation, you should use `std.traits.hasElaborateCopyConstructor`.