[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




"$" is explained were the member are declared: that's a marker added to remind you that you are not supposed to access the variable directly but through setters - this is due to Dart definition of private which is not class wise but lib wise.