alpha4: 12× sync throughput (100 → 1,179 bps mainnet catch-up)

Five sync-perf wins after profiling vs real mainnet seeds:

1. ce587ef — Quick wins bundle: log every 1000 (was per-block stderr),
   --backend=mem flag for ghive-sync, MaxBlocksPerInv 200→1000,
   FetchBatch tuning, INV-driven catch-up rate calculation.

2. d4b57c8 — Parallel block-signature recovery across peer goroutines.
   secp256k1 RecoverPublicKey was the dominant CPU cost (~47% of
   samples). With N peers we now get N-way parallel recovery for
   free; applyLoop never blocks on sig math.

3. 969b704 — Throttle inventory broadcast during catch-up. Stops
   spamming INV when we're miles behind head; saves bandwidth + CPU.

4. f7aa93a — Catch-up kicker keeps multiple chunks in flight per peer.
   Removed the len(missing)>0 gate on walk-forward AND fan out to all
   peers (not just the responder) so the slowest peer doesn't bottleneck
   the round.

5. b58e1ab — Per-block-ID signer cache (8K-entry LRU) + lock-free
   headBlockHint atomic mirror. Catch-up redundancy across N peers
   meant the same block triggered N sig recoveries; cache dedupes
   them. headBlockHint avoids the applyMu.RLock + state.Session
   materialize per inbound block.

Measured 60s mainnet sync (8 default seeds, --verify-against=./block_log):
- baseline (alpha3): 100 bps
- after all 5 wins: 1,179 bps avg, 5,042 bps peak burst

Time to 9M projection: 25h → ~2.1h.

All sig + block + state correctness preserved (verify-against 0
mismatches, replay 2M blocks 0 errors, all p2p+chain+blocklog tests
green under -race).

5 commits since alpha3.