Tweaks to optional<T>.

In order to comply with the interface of `std::optional<T>`, we should make it possible to default-construct optional objects. The post-condition shall be the same as in the standard: the object is an a *disengaged* state. Achieving this involves either adding an explicit default constructor or providing a default argument for the `none_t` overload. I used the latter technique.

Moreover, `std::optional<T>` provides an `operator->` to access the contained value. I added the missing operator overloads.