Fluent & Attribute configuration support, caching, compositional refactor, query mode

First things first I've added a branch called 'develop' where we will merge all of our PRs into. The master branch will be reserved for release quality work so that it is always prod ready. All work should be done in a feature branch off a personal fork and a PR created to merge into the develop branch. I'd prefer it if no work was merged into master until it has been up as PR for a while so that we can double check everything.

OK this is in a stable state now so I'm going to merge this over to the develop branch. Firstly I'll leave it here for a while so that anyone interested can pass an eye over it.

Features include:
 * Fluent API mappings (can set these on app bootstrapping and they will not be scattered through repositories)
 * Attribute mappings - this is not as flexible as other methods of configuration but should work well for simple scenarios
 * Caching of all mappings - once created the mapping configuration is cached for later use
 * Refactor - broke GraphNode down into compositional components as it was getting quite big and hard to maintain and will now be easier to unit test
 * QueryMode - can now specify that you would like GraphDiff to perform multiple queries on the initial load (this has not been thoroughly tested and I would appreciate some help testing this in develop branch)

/cc @andypelzer