Added 'noexcept' to the IClonable interface, and now Exception derives
from it.

I also fixed up the base exception declaration to make things more
intuitive and cleaner.
Overhauled the logging implementation.  Created a new ILog class that
basically does what AbstractLogger used to do, but without caring about the
actual logging device.

I touched up all the logger implementations and removed some useless ones
Improved the shared pointer implementation so it doesn't require target objects
to derive from SharedData. The drawback is that now the pointer has a
dynamically allocated reference counter that is shared among instances.

I couldn't figure out how to avoid this, but I'll check out the standard's
implementation of shared_ptr to see how they do it.