Create providers and tests

Created abstract `ContentProvider` and implemented it in `FileContentProvider`.  Wrote tests for reading and writing basic content and content from an empty file.

I wasn't able to use `onContentChange` for external file changes, as I wasn't able to find an event for it.  Added a TODO for future work, though.

Fixes #3431

@devoncarew 
Perhaps just `onChange`? `onContentChange` is fine too, so either one.

I think we should just use a plain `Stream` and not a type parameter. If the client wants the new contents, they can get it via the `read()` call.