Introduce tag_t type.
Use method destroy_ptr( ) to clear ptr in destructor.
Only destroy pointer if we are a pointer type.
Clean up assert.
Make argument O2 instead of O for clarity.
Add some asserts.
Initialize to unknown_type.