Adversarial review findings:
- CopyAttributes copied uploaded_image/cover_art_updated_at unconditionally,
so merging an album without a cover into one with a cover (retag onto an
existing album ID, or phase-2 moved-track matching) blanked the
destination's uploaded cover. Skip empty/NULL source values, mirroring the
created_at guard, and make the mock faithful to the same semantics.
- The disc and mediafile artwork readers did not fold cover_art_updated_at
into their cache keys, so song/disc art reached through the fromAlbum
fallback kept serving stale bytes after a cover upload or delete.
- The UI cover cache-buster compared timestamps lexicographically; mixed
offset/fractional formats could pick the older one. Compare as dates.