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.