Replace boost::variant with custom failable type

Hopefully this will make MSVC play ball.  Afaik variant doesn't use move
semantics unless move constructors are noexcept, but MSVC doesn't
support noexcept.  Move assignment isn't appropriate for this class, so
variant is overkill.