Real dependency graph was denser than the initial plan assumed:
- recordAspaAdoptionSnapshot needed atlasState (atlas-probes.js) and
rpkiAspaMap (rpki.js) -- threaded rpkiAspaMap through as an explicit
parameter instead of a rpki.js<->tracker.js circular require.
- atlasProbeCache-style reassignment problem recurred for rpkiAspaLastFetch
(a `let`, not a mutated object) -- exposed via a getRpkiAspaLastFetch()
getter, same fix pattern as atlas-probes.js's atlasState wrapper.
- ripe-stat.js's master fetchRipeStatCached dispatcher lives ~600 lines
away from its own cache/semaphore/fallback internals in the original
file; kept together in one module per the extraction plan (splitting
these apart previously caused the duplicate-declaration bug fixed
earlier this session).
Also drops confirmed-dead subCableCache/globalFacCache (declared, never
read). Verified via smoke-test harness (28/28 match). server.js: 5622 -> 5018 lines.