I'm generally in favor of this functionality. It enables some interesting server features (such as pullbundles).
This review needs to get hooked up to the Phabricator "stack" as the pullbundles patch(es). Using hg phabsend A::B should do that.
I'd like to see a test around a server not sending changegroup data. I /think/ the existing code will abort the while True loop in this case. But I don't fully understand when various attributes on pullop are updated. I'd also feel more comfortable about things if there were an explicit check in the loop that the tip of changelog increased if revisions were requested. I'm worried about getting into an infinite loop due to a misbehaving server. I /think/ I'd like to see the establishment of a contract that if revision data is requested, the server MUST respond with revision data.