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.