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 
You don't need to track if you're listening. The StreamController will call onListen when the first listener is added, and onCancel when the last listener is removed (it handles keeping track of the  count for you).