Add SnapcastService — JSON-RPC 2.0 control over snapserver
New leaf crate `zerod-snapcast` runs a single long-lived TCP connection
to snapserver on port 1705, with backoff reconnect and per-request id
correlation via oneshots. While disconnected the supervisor drains
queued commands with a fail-fast "not connected" error so RPCs don't
hang.
`SnapcastService` exposes GetServerStatus / ListClients / ListSnapStreams
plus the Set* mutators (Client volume/latency/name, Group stream/mute/
clients). Disabled mode keeps the service registered but returns
FAILED_PRECONDITION so reflection-based UIs still see it.
`Client.OnVolumeChanged` notifications are forwarded onto the event bus
as `SnapcastClientChanged` (reserved variant from PR1), so external
`snapctl` changes show up in `zerod events tail --filter snap.*`.
CLI: `zerod snapcast {status, clients, streams, volume, latency, name,
group-stream, group-mute, group-clients}`.
Smoke-tested against a Python mock snapserver — happy-path response
parses through the nested host/config/volume shape and flattens into
the proto SnapClient.