Rewrite maybe in terms of sum_type.

A substantial change that, for now, unfortunately leaves maybe slightly
less powerful than before. However, the implementation is a lot more
elegant, increases code reuse, and adheres to the "eat your own
dogfood" philosophy.

The major interface difference is that maybe can no longer be
contextually converted to bool, nor "dereferenced" to its value.
Instead, we should now try to rely on "pattern matching".

Eventually, some of the setbacks in terms of capabilities will be
removed, as Foldable and Monoid implementations should still be
possible. Even ForwardIterable might yet see a return.

Another setback is that some tests had to be disabled since the change
triggered a known bug in libc++'s mem_fn, where the resulting function
object does not have a const-marked operator().