Refactoring

@Nyholm I've stared working on it but when I was making changes I've discovered more things that need to be discussed.

Specification itself really can be applied only in one place - WHERE clause, for all the others operations it doesn't really make sense, here is the list of thing that also are part of a query:
- Selects (so selecting only partial result)
- Joins
- Order
- Limits
- Grouping
- Having

Also additionally there are thing that are applied to the query but are part of doctrine, like cache.

I'm sorry it took so long but once I realised that we have bigger problem to solve I couldn't really decide how to approach it and how to solve, current WIP in the PR.
We need to enable a way to add multiple options here. Say you want to cache and fetch as array. 
Putting QueryOptions in an array is bad practice of an API (you may not change arrays but you can easily chance a collection class). 

I suggest to create a `QueryOptionCollection` class. And let the second parameter of this function allow a `QueryOption` or a `QueryOptionCollection`.