[WIP] feat(ChangeDetector): unified architecture

**This PR is a WIP and will be subject to changes**

Status:

The PR should be closed to feature parity with the former implementation.
What I'll do next is to:
- reorganize the tests (split it across different files),
- add more tests for new features (TODO in the code),
- replace the old impl

To do:
- [ ] impl WatchGroup.toString()
- [ ] write a test for #1265 (should be fixed by this PR)
- [ ] Adapt the client code if #774 gets fixed (ng-repeat, ng-style, ...) The current code should work but could be simplified
- [ ] Use any method as filter (#934)
- [ ] Benchmark vs previous impl
- [ ] address #1091 

To discuss:
- Should prototypes have their own group and subsequent watches be added into their own group (probably better to keep 1 set)
- Should we allow coalescence for subsequently added watches (prototype only) -> was slower with the previous impl




We need to talk about this more in depth. But my latest thinking is that we can not create WatchGroup with context. The context needs to be something which we can assign later. The reason for this is that we want to be able to reset the context at runtime. The benefit would be to be able to reuse an instance of WatchGroup for performance reasons. Let's discus.