* Abstract domain provider from its stream transport
Creating new provider-consuming extensions, like [a new
platform](https://github.com/MetaMask/metamask-extension/blob/develop/docs/porting_to_new_environment.md)
can be frustrating for new contributors because our provider
construction has been tangled with our streaming interface.
Here I've broken up our streaming domain connection from the provider
construction, so developers can more easily construct local and
domain-restricted providers without dealing with streams.
* Abstract public API from stream interface
* clean up noop
* Document non-streaming interface
* getSiteMetadata must be async
* Clean up filters on stream end
* Document cleaning up filters
* Allow named filterMiddleware to be cleaned up
* Linted
* Require site metadata
* Destroy any destroyable middleware during cleanup
* Lint
It skimmed over the complicated parts before, and left people unsure how
to proceed. I now dive straight into what will confuse them, and provide
links directly to the code that can help clarify.