Do socket operations synchronously if blocking isn't needed

Summary:
Optimized this flow to not yield back to IOLoop unless it's in a
position where it would have to block. This makes things a lot faster,
cuts down on yielding by a lot, and makes requests not starve
themselves.

Test Plan:
Load testing, baby!

Reviewers: josh

Maniphest Tasks: T5540