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 
This will fire if there is a change in any file in the workspace. Instead, we want to only fire if the specified file is modified. Something like:
```
if (event.modifiedFiles.contains(file)) {
  _changeController.add(null);
}
```