Our previous trigger detection would refcount touches, this can be error prone when there's a situation that doesn't report a contact loss. Instead, we now ask the physics engine if there's any contacts still touching, if there isn't then we know we have exited the trigger.
We also now have events for when the root gameobject enters or exits a trigger. This is because a gameobject could have multiple colliders but we don't want to respond to each collider, just once for the whole gameobject.