split $WatchProvider.WatchManager#watch() into watch() and watch_()
add protection against circular structures to $watch delivery iteration logging
move value tracking to $WatchProvider.Watcher
add $watch.watchCollection(obj:!Object, expression:string, listener:function)