* fix: use exponential backoff when a download fails
The retry used a flat 3 second wait over 3 attempts, which covers only
about 6 seconds of downtime. A CI runner lost DNS for approximately a
minute and the PyPy download failed. Wait 3, 6, 12, 24, then 48 seconds
over 6 attempts.
Assisted-by: ClaudeCode:claude-opus-5
* ci: raise the uv HTTP retry count
uv stops after 3 retries, which was too few when a runner lost DNS for
approximately a minute during a test run.
Assisted-by: ClaudeCode:claude-opus-5
* fix: do not retry a download after a client error
A bad URL will not fix itself, and the longer backoff made the wait
before the report about 93 seconds. Report 4xx responses at once, and
keep retrying 5xx.
Assisted-by: ClaudeCode:claude-opus-5