proxy mode, pt 2

The ReverseProxy code from the standard library doesn't actually
give us the control that we want. Pull it down and rip out what
we don't need, adding tests in the process.
I'd prefer to keep it like it is. Doing this keeps the concept of time out of the `endpoint` struct altogether. There are test-only implementations of `failFunc` that don't care about time one bit.