virtual/abstract/interface classes need virtual destructors...

... to prevent undefined behavior when destructing derived objects.

Introduce ID_NOEXCEPT and ID_DEFAULT_DESTRUCTOR to abstract implementation details.