Decided to add copy-construction and had to implement all 3. This is the
so-called "Rule of 3" whereby if we implement any one of the destructor,
copy constructor or assignment operator we have to implement all 3.

Notice that I've also used the copy and swap idiom here. This is one of
the ways of ensuring that I am providing a strong exception guarantee as
well as avoiding code duplication.