anchor.diff:  
     String get markup => _reply._markup;
   
  -  Stream<UiReply> get onRemove => throw "not implemented";
  +  Stream<UiReply> get onRemove => _reply.availability.onExit.map((_) => this);
   
     void use() {
       _interactions.add(new UseReplyAction(_reply));
  
positive.code:     return speech;
    }
  
    Voice voice({String name: ''}) => new Voice(name, this);
  
    Stream<Speech> get _onAddSpeech => _dialog.stream;
  }
  
negative.code: 
    final _replies = new StreamController<Reply>.broadcast(sync: true);
  
    /// Lazily initialized scope which all replies share, making them mutually
    /// exclusive by default.
    // TODO: Support non mutually exclusive replies?
    _CountScope _replyUses;
  
    Speech(this._markup, this._scope, this._speaker, this._target);
  
    Reply addReply(String markup, {Scope scope: const Always()}) {
      if (_replyUses == null) {
        // TODO parameterize max?
        _replyUses = new _CountScope(1);
      }
      var reply = new Reply(this, markup, _replyUses, scope);
      reply.availability.onEnter.listen((_) => _replies.add(reply));
      return reply;
    }
  