Fix core::optional<T>'s copy and assign constructors

Add additional tests for core::optional<T>

FIXME: The noexcept signature for core::optional<T>::swap is causing
issues on GCC 4.8.0 with basic integers. The noexcept signature has been
removed for the time being.