refactor: extract media source and playback into pluggable abstractions
- MediaSource trait + SourceRegistry for pluggable URL resolution
- YtdlpSource extracted from media.rs, DirectSource added
- Player struct encapsulates pipeline lifecycle (start/abort/ended)
- media.rs is now a pure ffmpeg transcoder (transcode_to_fmp4)
- extractor field renamed to SourceKind enum across domain + DB
- TrackPublishers moved from types.rs to transport.rs
- Fix: init segment now published to broadcast so skip advances video
- Frontend: debug logging gated, connection indicator, loading states,
better empty states, button disabled states