anchor.diff:      value = _combinator(_values);
     }
   
  -  void dispose() {
  -    for (var binding in _bindings.values) {
  +  /**
  +   * Closes the observer.
  +   *
  +   * This happens automatically if the [value] property is no longer observed,
  +   * but this can also be called explicitly.
  +   */
  +  void close() {
  +    for (var binding in _observers.values) {
         binding.cancel();
       }
  -    _bindings.clear();
  +    _observers.clear();
       _values.clear();
  -
  -    _disposed = true;
       value = null;
     }
  +
  +  _unobserved() => close();
   }
  
positive.code: 
    // TODO(jmesserly): ideally these would be String keys, but sometimes we
    // use integers.
    Map<dynamic, StreamSubscription> _bindings = new Map();
    Map _values = new Map();
    bool _scheduled = false;
    bool _disposed = false;
    Object _value;
  
    CompoundBinding([CompoundBindingCombinator combinator]) {
  
negative.code:   }
  
    void resolve() {
      if (_observers.isEmpty) return;
      _scheduled = false;
  
      if (_combinator == null) {
  