Use Interfaces anywhere.

In practice, there were still too many concrete classes, which makes
integration into a framework hard. To overcome this, the codebase has
been refactored to use Interfaces when a resource is needed.

All necessary Interfaces have been created, and the existing concrete
classes now implement these interfaces.
Merge pull request #1 from jacobkiers/feature/use-interfaces

Use Interfaces everywhere.