stream: fast-path no-CORS stations + lifecycle telemetry + chat commands
Three improvements to the radio mini-player (chat.mjs) and standalone
kpbj.mjs piece, all driven by the same BIOS stream:play handler.
1. Speed — per-station `cors` flag.
KPBJ's Icecast 2.4.4 never sends Access-Control-Allow-Origin, so the
crossOrigin="anonymous" probe always failed and we waited ~10s for the
fallback retry. Each station config now declares whether the server
supports CORS (r8dio via radio.co → true; KPBJ → false), and BIOS
skips the probe entirely when cors:false. Single round-trip
connection. The auto-fallback path still exists for unknown servers.
2. Telemetry — stream:state lifecycle events.
BIOS now listens to the <audio> element's loadstart, progress,
canplay, waiting, playing, stalled, and error events and forwards
each as `stream:state` with a named phase. The chat mini-player's
status line shows "connect…" → "buffer…" → "● LIVE" with animated
ellipsis so the user can see real progress instead of a static "…".
lib/radio.mjs exposes the same streamState on RadioState for the
standalone kpbj.mjs player, which now displays "Connecting",
"Buffering", "Reconnecting", etc.
3. Word-to-start — chat input commands.
Type `bj` / `r8dio` to switch to that station and start playing,
`radio` to toggle the active station, or `radio off` / `hush` /
`mute radio` / `radio stop` to pause. Commands are intercepted
before the chat-message send path, so they never leak into the
room. Switching stations pauses the previous one first.