ArrTop::Backend
Abstraction over an *arr instance (Sonarr or Radarr). Concrete backends wrap
the corresponding client shard and expose their download queue as normalized
QueueRows so the Poller/UI never touch the underlying model types.
Network errors are not swallowed here — a failed request raises the
shard's ApiError; the Poller decides per-backend how to handle it.