perf(digest): Use linked list for watchers

## Performance
This makes it a lot faster to add and remove watchers and it doesn't seem to slow down the digest loop.

### dart2js (new: linked watchers)
noop: => 153,147,355,556 ops/sec (0 us) stdev(415.89679)
empty scope $digest(): => 567,981 ops/sec (2 us) stdev(0.01002)
adding/removing 4000 watchers: => 406 ops/sec (2,461 us) stdev(0)
4000 dummy watchers on scope: => 7,680 ops/sec (130 us) stdev(0.0002)
3000 watchers on scope: => 201 ops/sec (4,965 us) stdev(0.00001)

### dart2js (old: non-linked watchers)
noop: => 153,222,244,444 ops/sec (0 us) stdev(150.92445)
empty scope $digest(): => 537,580 ops/sec (2 us) stdev(0.01016)
adding/removing 4000 watchers: => 1 ops/sec (1,327,937 us) stdev(0)
4000 dummy watchers on scope: => 4,091 ops/sec (244 us) stdev(0.00015)
3000 watchers on scope: => 177 ops/sec (5,638 us) stdev(0.00001)