ActiveTrack and PlaybackQueue were mutated concurrently by HTTP
handlers (Get/Status/Skip/Start/...) and the background
trackSwitcherGoroutine with no synchronization. Under concurrent
jukebox polling this let ActiveTrack get stuck pointing at a track
whose mpv process had already exited, so subsequent Status calls hit
"trying to send command on closed mpv client" and the queue never
advanced to the next song.
Adds a mutex to playbackDevice, held by every public method and by
the trackSwitcher goroutine's track-swap. Public methods delegate to
internal *Locked helpers to avoid self-deadlock when one action calls
another (e.g. Skip -> start, Set -> clear+add).
Fixes#5660
Co-Authored-By: Claude <noreply@anthropic.com>