anchor.diff:    void unmount() {
       assert(_debugLifecycleState == _ElementLifecycle.mounted);
       assert(_widget != null);
  -    assert(_slot == null);
       assert(_depth != null);
       assert(() { _debugLifecycleState = _ElementLifecycle.defunct; return true; });
     }
   
  +  // TODO(ianh): Merge this into the binding, expose for tests
     static void flushBuild() {
       _buildScheduler.buildDirtyElements();
     }
   }
   
  -class _BuildScheduler {
  -  final Set<BuildableElement> _dirtyElements = new Set<BuildableElement>();
  -  bool _inBuildDirtyElements = false;
  -
  -  void schedule(BuildableElement element) {
  -    if (_dirtyElements.isEmpty)
  -      scheduler.ensureVisualUpdate();
  -    _dirtyElements.add(element);
  -  }
  -
  -  void _absorbDirtyElements(List<BuildableElement> list) {
  -    list.addAll(_dirtyElements);
  -    _dirtyElements.clear();
  -    list.sort((BuildableElement a, BuildableElement b) => a._depth - b._depth);
  -  }
  -
  -  void buildDirtyElements() {
  -    if (_dirtyElements.isEmpty)
  -      return;
  -
  -    _inBuildDirtyElements = true;
  -    try {
  -      while (!_dirtyElements.isEmpty) {
  -        List<BuildableElement> sortedDirtyElements = new List<BuildableElement>();
  -        _absorbDirtyElements(sortedDirtyElements);
  -        int index = 0;
  -        while (index < sortedDirtyElements.length) {
  -          sortedDirtyElements[index]._rebuildIfNeeded();
  -          if (!_dirtyElements.isEmpty) {
  -            assert(_dirtyElements.every((Element element) => !sortedDirtyElements.contains(element)));
  -            _absorbDirtyElements(sortedDirtyElements);
  -            index = 0;
  -          } else {
  -            index += 1;
  -          }
  -        }
  -      }
  -    } finally {
  -      _inBuildDirtyElements = false;
  -    }
  -    assert(_dirtyElements.isEmpty);
  -  }
  -}
  -
  -final _BuildScheduler _buildScheduler = new _BuildScheduler();
  -
   typedef Widget WidgetBuilder();
   
  +/// Base class for the instantiation of StatelessComponent and StatefulComponent
  +/// widgets.
   abstract class BuildableElement<T extends Widget> extends Element<T> {
     BuildableElement(T widget) : super(widget);
   
  
positive.code: 
    void mount(Element parent, dynamic slot) {
      super.mount(parent, slot);
      _child = _updateChild(_child, _widget.child, uniqueChild);
    }
  
    void update(T newWidget) {
      super.update(newWidget);
      assert(_widget == newWidget);
      _child = _updateChild(_child, _widget.child, uniqueChild);
    }
  
    void insertChildRenderObject(RenderObject child, dynamic slot) {
      final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer
      assert(renderObject is RenderObjectWithChildMixin);
      assert(slot == uniqueChild);
      renderObject.child = child;
      assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer
    }
  
negative.code:   Element _child;
    bool _dirty = true;
  
    void mount(Element parent, dynamic slot) {
      super.mount(parent, slot);
      assert(_child == null);
      _rebuild();
      assert(_child != null);
    }
  
    // This is also called for the first build
    void _rebuild() {
      assert(_debugLifecycleState == _ElementLifecycle.mounted);
      _dirty = false;
  