anchor.diff:  
     Future run() {
       sdkManager.tryToAutoConfigure(complainOnFailure: true);
  -    return new Future.delayed(new Duration(seconds: 1));
  -  }
  -}
  +    return new Future.delayed(new Duration(milliseconds: 500));
  +  }
  +}
  
positive.code:   final Directory directory;
  
    Sdk(this.directory);
  
    bool get isValidSdk =>
        directory.getFile('version').existsSync() &&
  
negative.code: 
  final Version _minSdkVersion = new Version.parse('1.11.0');
  
  // User cases:
  
  // cold start
  // - we see no sdk value
  // - try and auto-locate
  // - display message on success (no message on failure)
  
  // start up, w/ sdk value
  // - validate it
  // - if good, create an sdk
  // - on bad sdk, no message, no sdk created
  
  // explicit auto-locate sdk command
  // - try and auto locate
  // - message on success; message in failure
  
  // user types in the settings field
  // - buffer changes - 2 second delay? 5 second delay? could we buffer longer on failure?
  // - if we auto-locate, display a success message
  // - if no, display a failure message
  
  class SdkManager implements Disposable {
    StreamController<Sdk> _controller = new StreamController.broadcast(sync: true);
  
    Sdk _sdk;
    StreamSubscription _prefSub;
  
    SdkManager() {
      // Load the existing setting and initiate auto-discovery if necessary.
      String currentPath = atom.config.getValue(_prefPath);
  
      if (currentPath == null || currentPath.isEmpty) {
        tryToAutoConfigure(complainOnFailure: false);
      } else {
        Sdk sdk = new Sdk.fromPath(currentPath);
        if (sdk.isValidSdk) _setSdk(sdk);
      }
  
      // TODO: debounce
      _prefSub = atom.config.onDidChange(_prefPath).listen((value) {
        _setSdkPath(value);
      });
    }
  
  