The app owns final destruction, such as when closing a floating player.
Retained session, or null while the host player is not ready.
Memoize with useCallback; return null until the player is ready. Never create during render.
The hook owns startup and destruction.
Selects session ownership. External sessions survive unmount; hook-owned sessions are recreated when the memoized createSession callback changes.