Use std::aligned_storage in optional, also optimized optional's code a bit