Implement move constructors
Add move assignment
Use std::swap()