Keep the old streamSessionId after stop, poll until phase=stopped before
allowing join again, disable controls while stopping, and retry join on
57007 for Monitor and MediaView.
Treat first-manifest 404 as recoverable: backoff-reload the same signed
play URL for 15s instead of failing or refreshing /play-url. Keep
heartbeat independent, and only fatalize 403/TLS/CORS or exhausted 404.
Invalidate in-flight join with generation/disposed, leave returned sessions
immediately when the page already left, release via keepalive on pagehide,
and rejoin on heartbeat/play-url 57006 instead of refreshing stale URLs.