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 
Let's construct the stream controller here, using this constructor:

https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async.StreamController#id_StreamController-broadcast

It will let us add hooks (onListen and onCancel) when somebody starts and stops listening to the stream. What we want to do when somebody starts listening, is to listen for all workspace events (file.workspace.onResourceChange), filter those for just change events for this resource, and then notify the changed controller.

We possibly may also want a separate controller for deleted events (`onDeleted`?). We could also add that later if necessary.