The Skills Hub page fetched the catalog with a bare fetch and no timeout,
so a silently hung connection (DNS pollution, TLS resets) left it on
"Loading the catalog…" forever, and any load error fell through to the
misleading "No skills found" empty state with no retry path.
Read the catalog bodies as streams and abort only when no bytes have
arrived for 45s — slow-but-alive transfers keep re-arming the timer and
are never cut off, while a dead connection surfaces as a stall error.
Failed loads now render a dedicated error card with a Retry button
instead of the empty state, and effect cleanup aborts the in-flight
fetch on unmount.
Fixes#97861