The clone trade is for types that can make copies of themselves.
For this to work, it needs to construct an independent copy using the self keyword and then return
it.
A clones definition is as what's followed, so we have our trait clone, which also implements the sized
trait, and then we have a couple of methods associated with it.
Cloning a value typically means allocating copies of anything it owns, which can make clones very time
and memory expensive.
Just imagine taking a vector of strings and cloning.
Every string inside the vector would also be cloned.
So as you can expect, a clone can indeed be very expensive.
The types like AI 32 and Boolean implement clone, but other things such as mutex, which we will talk
about in the concurrency section, do not.