Shellbox (T260330) requires MediaWiki to post potentially large HTTP requests that are assembled in PHP in a custom multipart/mixed format, and to receive large responses in the same format. In the library I used PSR-7 abstractions, allowing this to theoretically be done without requiring either the requests or responses to be held in memory.
However, MediaWiki's existing abstractions for HTTP requests do not allow response streaming. In the WIP patch, I had to buffer the response into a local temporary file.
The obvious way to implement a PSR-7 HTTP client is to just use Guzzle. Guzzle is already a dependency. The only thing that is missing is a factory function (say HttpRequestFactory::createGuzzleClient()), and possibly a subclass. The returned client object should respect the maximum timeout configuration $wgHTTPMaxTimeout and $wgHTTPMaxConnectTimeout, and it should have a default User-Agent which comes from HttpRequestFactory::getUserAgent().
Guzzle has asynchronous HTTP support. If I understand it correctly, this feature is implicitly used for response streaming. That's how the caller can read data from the response stream while the HTTP request is still active and the server is still sending data.