API Changed how content sources are managed

Content sources are now configurable so that it is possible to have separate
sources utilising the same underlying ContentReader/Writer type (they're
just configured differently)
API Change to use dependency injection

Changed api to use dependency injection for configuring the
content readers/writers that are used.
API Refactor content reader/writer classes

* Create a base class to handle ID manipulation
* Pass through the 'type' of the reader/writer on creation
  so that elements have a consistent reference to the source of the content