withRetry
Retry a synchronous, idempotent GET on TRANSIENT failures only: IOException (connection reset/abort/ timeout) and 429/5xx. 4xx is permanent → not retried. 3 attempts, exponential backoff. The JDK HttpClient's own retry is connection-establishment-only.