discovery: add TTL'd cluster->cores cache
Commit

Adds cluster_cores.json (alongside nodes.json in the cache dir): a host -> {core_urls, fetched_at} map memoizing /.well-known discovery, with a 7d TTL. Get() reports both freshness and existence so callers can re-fetch on expiry but fall back to a stale entry if the cluster is briefly unreachable.
Unlike a context binding this stores only the objective cluster->core fact, never which local account to use, so a multi-account user is never silently pinned to one identity. Safe to delete by hand to force re-discovery.
Factors the shared lock/atomic-write/read primitives out of the existing node cache so both files reuse them with no duplication; existing cache tests guard the refactor.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com Entire-Checkpoint: efec36727758