Introduce DoctorValidatorsProvider to improve extensibility of flutter_tools (#16918)

DoctorValidatorsProvider is injected into Doctor to allow
overriding of DoctorValidators without needing to override
the whole Doctor instance.
diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart
index 8b41406..28d2035 100644
--- a/packages/flutter_tools/lib/src/context_runner.dart
+++ b/packages/flutter_tools/lib/src/context_runner.dart
@@ -56,7 +56,8 @@
       Config: () => new Config(),
       DevFSConfig: () => new DevFSConfig(),
       DeviceManager: () => new DeviceManager(),
-      Doctor: () => new Doctor(),
+      Doctor: () => const Doctor(),
+      DoctorValidatorsProvider: () => DoctorValidatorsProvider.defaultInstance,
       Flags: () => const EmptyFlags(),
       FlutterVersion: () => new FlutterVersion(const Clock()),
       GenSnapshot: () => const GenSnapshot(),
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index 8b31a4d..a988918 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -26,15 +26,19 @@
 
 Doctor get doctor => context[Doctor];
 
-class ValidatorTask {
-  ValidatorTask(this.validator, this.result);
-  final DoctorValidator validator;
-  final Future<ValidationResult> result;
+abstract class DoctorValidatorsProvider {
+  /// The singleton instance, pulled from the [AppContext].
+  static DoctorValidatorsProvider get instance => context[DoctorValidatorsProvider];
+
+  static final DoctorValidatorsProvider defaultInstance = new _DefaultDoctorValidatorsProvider();
+
+  List<DoctorValidator> get validators;
 }
 
-class Doctor {
+class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider {
   List<DoctorValidator> _validators;
 
+  @override
   List<DoctorValidator> get validators {
     if (_validators == null) {
       _validators = <DoctorValidator>[];
@@ -60,6 +64,20 @@
     }
     return _validators;
   }
+}
+
+class ValidatorTask {
+  ValidatorTask(this.validator, this.result);
+  final DoctorValidator validator;
+  final Future<ValidationResult> result;
+}
+
+class Doctor {
+  const Doctor();
+
+  List<DoctorValidator> get validators {
+    return DoctorValidatorsProvider.instance.validators;
+  }
 
   /// Return a list of [ValidatorTask] objects and starts validation on all
   /// objects in [validators].