Burst-proof measurement + provider canary
Makes the Speed Test's numbers burst-proof and its endpoints pre-checked.
- The reported rate is now computed from cumulative bytes over the stable window (a windowed mean), not a median of 100 ms ticks. Upload progress arrives from the network stack in multi-MB bursts — most ticks legitimately read zero with spikes between — and a median of that could report a healthy upload as stalled. The chart keeps its live 10 Hz detail; the number is now immune to the burstiness.
- Before the load phases commit to a provider, a one-second canary (100 KB down + 1 MB up) verifies it end to end — rate limiting or refused uploads now trigger an automatic Apple → Cloudflare fallback instead of a failed phase.
- When a phase still can't produce a stable rate, the Test log says what actually moved ("94 MB sent, ~75 Mbps average") rather than implying a dead pipe.
Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.