While it should be possible to use every PSR-7 aware HTTP client with any
request, URI and stream implementation, instantiating objects explicitly would
still tie the code to a specific implementation. If each reusable library is
tied to a specific message implementation, an application could end up
installing several message implementations. The factories move instantiation
out of the library code, further decoupling libraries from implementation.

The FIG was pretty straightforward by NOT putting any construction logic into PSR-7.
The MessageFactory aims to provide an easy way to construct messages.

It would make sense to also provide factories for the server side constructs
ServerRequestInterface and UploadedFileInterface. We did not get around
to do that yet. Contributions are welcome if you want to define the
ServerRequestFactory and UploadedFileFactory.