Cleanup Client.exchange
Cleanup Client.exchange

Make Client's exchange function easier to read by moving timeout logic
into separate functions.

Start the timers closer to where they're used so that time from other
logic doesn't impact the deadlines.

tsenart/dns,josephyzhou/dns,cloudflare/dns,skyportsystems/dns,ym/go-dns,benbearchen/dns,tempbottle/dns,rolandshoemaker/dns,hugozhu/dns,modulexcite/dns,bragr/dns,skynet/dns,jdef/dns,asergeyev/dns,bboreham/dns,michaelharo/dns,flebarbe/dns,janstk/dns,ezoic/dns,jmhodges/dns,curtiszimmerman/dns,Psiphon-Inc/dns,miekg/dns,ErikDubbelboer/dns,letsencrypt/dns