Solve is blocking, so no need to run initialization code in a separate goroutine. Removes the need for s.start. Once the listener is closed, all I/O resources have been returned. No need to wait for http.Serve to return. Removes the need for s.end.
This is a loop that interacts with the ACME server, not the individual challenges. Also switch to exponential back-off polling for good measure.
[ci skip]