Add hidden options --extra-front-end-options and --extra-gen-snapshot-options to flutter tool (#12219)

This CL introduces 2 hidden options to 'flutter build aot' and 'flutter run' for passing arbitrary arguments to front-end server and to gen_snapshot tool when building and running flutter app in --profile or --release modes.

The ability to pass arbitrary options simplifies various experiments, as it removes the need to change defaults and rebuild flutter engine for every tested configuration.
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index b4be334..672c43b 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -10,7 +10,10 @@
 
 /// Information about a build to be performed or used.
 class BuildInfo {
-  const BuildInfo(this.mode, this.flavor, { this.previewDart2 });
+  const BuildInfo(this.mode, this.flavor,
+      {this.previewDart2,
+      this.extraFrontEndOptions,
+      this.extraGenSnapshotOptions});
 
   final BuildMode mode;
   /// Represents a custom Android product flavor or an Xcode scheme, null for
@@ -24,6 +27,12 @@
   // Whether build should be done using Dart2 Frontend parser.
   final bool previewDart2;
 
+  /// Extra command-line options for front-end.
+  final String extraFrontEndOptions;
+
+  /// Extra command-line options for gen_snapshot.
+  final String extraGenSnapshotOptions;
+
   static const BuildInfo debug = const BuildInfo(BuildMode.debug, null);
   static const BuildInfo profile = const BuildInfo(BuildMode.profile, null);
   static const BuildInfo release = const BuildInfo(BuildMode.release, null);