Separate visitors for construction and assignment
Implement Variant::as() const in terms of Variant::as().
Specialize RequiresWrapper<> for std smart pointers