Switching to implicit or default destructors

In an effort to make sure resources are managed correctly, I’ve gone
through and removed empty destructors wherever possible. Many classes
now obey the “Rule of Zero”. The exceptions that arose were either
classes where the “Rule of Three” (or variations thereof) would apply
better, or places where the destructor was made pure virtual to create
an abstract class.

The next step is to determine copy and move semantics for the classes
that still define destructors.