Handle a failure on communicate()

After much debugging of the subject bug, we've concluded that a
failure and an exception of OSError with EAGAIN from communicate()
indicates some monkey business. In the specific case that we're seeing
in Trove, it is because monkey patching didn't quite get done the way
it should.

In any event, retrying isn't the answer.  This change reverts an
earlier change that retried the communicate() call and instead hurls
the OSError exception back to the caller, if we are out of retries. A
test case to fake the communicate() failure has been amended to ensure
that we handle this in what we believe now to be the right way.

Originally-Submitted-In: I2450d2dc425a3d29eaba4d5ff9badc4a992a0ec8

Change-Id: Ie36d77eebb2c20124a61ff6029c3b97bfffb9427
Closes-Bug: #1347337
Related-Bug: #1365736
Merge "Handle a failure on communicate()"