BaseProperty cleanup: explicitly define destructor in its own translation unit, avoid duplicated vtables