Fix interface of Either

* Fix using optional declaration
* Remove redundant assign operator which takes Right type
* Add swap
* Add ref-qualifier and overload to operator*
* Add non-const overload to operator->
Add implementations for Either