32c8d4f28f
Slice 2 of the cover-caching pass. SyncController now downloads cover bytes for newly-upserted albums + playlists into the shared flutter_cache_manager disk cache after each sync transaction commits. A cold-start scroll through the home grid paints from disk on the very first frame instead of firing one HTTP per visible tile. Best-effort: fire-and-forget after commit, concurrency 3, per-URL failures swallowed (404 for collages that haven't built yet, 401 during token-refresh races). Artist covers skipped — ArtistRef.coverUrl is server-derived from "most-recent album" and not reconstructible client-side; album pre-warm already covers the artist's primary visual. Auth header reuses sessionTokenProvider for parity with ServerImage.