Simplify the usage of Navigator's routes argument

(These are changes cherry-picked from in-flight branches since they are
more independent and could be helpful even without those changes.)

- Change RouteBuilder's signature to take a single argument in which the
  other fields are placed, so that we can keep iterating on those
  arguments without having to break compatibility each time. Also, this
  makes defining route builders much simpler (only one argument to
  ignore rather than a variable number).

- Expose the next performance to RouteBuilders, since sometimes the
  route itself might not be where it's used.

- Allow BuildContext to be used to walk children, just like it can for
  ancestors

- Allow BuildContext to be used to get the Widget of the current
  BuildContext

- Allow StatefulComponentElement to be referenced with a type
  specialisation so that you don't have to cast when you know what the
  type you're dealing with actually is.
diff --git a/examples/address_book/lib/main.dart b/examples/address_book/lib/main.dart
index c12a7d2..2bca9be 100644
--- a/examples/address_book/lib/main.dart
+++ b/examples/address_book/lib/main.dart
@@ -101,7 +101,7 @@
     title: 'Address Book',
     theme: theme,
     routes: <String, RouteBuilder>{
-      '/': (NavigatorState navigator, Route route) => new AddressBookHome(navigator: navigator)
+      '/': (RouteArguments args) => new AddressBookHome(navigator: args.navigator)
     }
   ));
 }
diff --git a/examples/demo_launcher/lib/main.dart b/examples/demo_launcher/lib/main.dart
index 4fc089c..2bbef23 100644
--- a/examples/demo_launcher/lib/main.dart
+++ b/examples/demo_launcher/lib/main.dart
@@ -206,7 +206,7 @@
     title: 'Flutter Demos',
     theme: _theme,
     routes: {
-      '/': (NavigatorState navigator, Route route) => new DemoHome()
+      '/': (RouteArguments args) => new DemoHome()
     }
   ));
 }
diff --git a/examples/fitness/lib/main.dart b/examples/fitness/lib/main.dart
index 1f12e11..98f87db 100644
--- a/examples/fitness/lib/main.dart
+++ b/examples/fitness/lib/main.dart
@@ -92,8 +92,6 @@
 class FitnessAppState extends State<FitnessApp> {
   UserDataImpl _userData;
 
-  Map<String, RouteBuilder> _routes;
-
   void initState() {
     super.initState();
     loadFitnessData().then((UserData data) {
@@ -102,36 +100,6 @@
       print("Failed to load data: $e");
       setState(() => _userData = new UserDataImpl());
     });
-
-    _routes = {
-      '/': (NavigatorState navigator, Route route) {
-        return new FeedFragment(
-          navigator: navigator,
-          userData: _userData,
-          onItemCreated: _handleItemCreated,
-          onItemDeleted: _handleItemDeleted
-        );
-      },
-      '/meals/new': (navigator, route) {
-        return new MealFragment(
-          navigator: navigator,
-          onCreated: _handleItemCreated
-        );
-      },
-      '/measurements/new': (NavigatorState navigator, Route route) {
-        return new MeasurementFragment(
-          navigator: navigator,
-          onCreated: _handleItemCreated
-        );
-      },
-      '/settings': (navigator, route) {
-        return new SettingsFragment(
-          navigator: navigator,
-          userData: _userData,
-          updater: settingsUpdater
-        );
-      }
-    };
   }
 
   void _handleItemCreated(FitnessItem item) {
@@ -158,17 +126,43 @@
     });
   }
 
-  final ThemeData _theme = new ThemeData(
-    brightness: ThemeBrightness.light,
-    primarySwatch: Colors.indigo,
-    accentColor: Colors.pinkAccent[200]
-  );
-
   Widget build(BuildContext) {
     return new App(
-      theme: _theme,
+      theme: new ThemeData(
+        brightness: ThemeBrightness.light,
+        primarySwatch: Colors.indigo,
+        accentColor: Colors.pinkAccent[200]
+      ),
       title: 'Fitness',
-      routes: _routes
+      routes: {
+        '/': (RouteArguments args) {
+          return new FeedFragment(
+            navigator: args.navigator,
+            userData: _userData,
+            onItemCreated: _handleItemCreated,
+            onItemDeleted: _handleItemDeleted
+          );
+        },
+        '/meals/new': (RouteArguments args) {
+          return new MealFragment(
+            navigator: args.navigator,
+            onCreated: _handleItemCreated
+          );
+        },
+        '/measurements/new': (RouteArguments args) {
+          return new MeasurementFragment(
+            navigator: args.navigator,
+            onCreated: _handleItemCreated
+          );
+        },
+        '/settings': (RouteArguments args) {
+          return new SettingsFragment(
+            navigator: args.navigator,
+            userData: _userData,
+            updater: settingsUpdater
+          );
+        }
+      }
     );
   }
 }
diff --git a/examples/game/example_effect_line.dart b/examples/game/example_effect_line.dart
index 4a6e7cc..05323d0 100644
--- a/examples/game/example_effect_line.dart
+++ b/examples/game/example_effect_line.dart
@@ -62,7 +62,7 @@
     );
   }
 
-  Column _buildColumn(NavigatorState navigator, Route route) {
+  Column _buildColumn(RouteArguments args) {
     return new Column([
       new Flexible(child: _buildSpriteWidget()),
       _buildTabBar()
diff --git a/examples/game/lib/main.dart b/examples/game/lib/main.dart
index a93038d..2cb407a 100644
--- a/examples/game/lib/main.dart
+++ b/examples/game/lib/main.dart
@@ -92,11 +92,11 @@
     );
   }
 
-  Widget _buildGameScene(NavigatorState navigator, Route route) {
+  Widget _buildGameScene(RouteArguments args) {
     return new SpriteWidget(_game, SpriteBoxTransformMode.fixedWidth);
   }
 
-  Widget _buildMainScene(navigator, route) {
+  Widget _buildMainScene(RouteArguments args) {
     return new Stack([
       new SpriteWidget(new MainScreenBackground(), SpriteBoxTransformMode.fixedWidth),
       new Column([
@@ -109,10 +109,10 @@
                 _sounds,
                 (lastScore) {
                   setState(() {_lastScore = lastScore;});
-                  navigator.pop();
+                  args.navigator.pop();
                 }
               );
-              navigator.pushNamed('/game');
+              args.navigator.pushNamed('/game');
             },
             texture: _spriteSheetUI['btn_play_up.png'],
             textureDown: _spriteSheetUI['btn_play_down.png'],
diff --git a/examples/game/test_drawatlas.dart b/examples/game/test_drawatlas.dart
index 135334e..dba1748 100644
--- a/examples/game/test_drawatlas.dart
+++ b/examples/game/test_drawatlas.dart
@@ -36,7 +36,7 @@
     title: 'Test drawAtlas',
     theme: _theme,
     routes: {
-      '/': (NavigatorState navigator, Route route) {
+      '/': (RouteArguments args) {
         return new SpriteWidget(
           new TestDrawAtlas(),
           SpriteBoxTransformMode.fixedWidth
diff --git a/examples/game/test_physics.dart b/examples/game/test_physics.dart
index 2a9ad88..aabb773 100644
--- a/examples/game/test_physics.dart
+++ b/examples/game/test_physics.dart
@@ -34,7 +34,7 @@
       primarySwatch: Colors.purple
     ),
     routes: {
-      '/': (navigator, route) {
+      '/': (RouteArguments args) {
         return new SpriteWidget(
           new TestBed(),
           SpriteBoxTransformMode.letterbox
diff --git a/examples/stocks/lib/main.dart b/examples/stocks/lib/main.dart
index 4b2c1e8..a931d54 100644
--- a/examples/stocks/lib/main.dart
+++ b/examples/stocks/lib/main.dart
@@ -82,7 +82,7 @@
       if (path.length != 3)
         return null;
       if (_stocks.containsKey(path[2]))
-        return (navigator, route) => new StockSymbolViewer(navigator, _stocks[path[2]]);
+        return (RouteArguments args) => new StockSymbolViewer(args.navigator, _stocks[path[2]]);
       return null;
     }
     return null;
@@ -93,8 +93,8 @@
       title: 'Stocks',
       theme: theme,
       routes: <String, RouteBuilder>{
-         '/':         (navigator, route) => new StockHome(navigator, _stocks, _symbols, _optimismSetting, modeUpdater),
-         '/settings': (navigator, route) => new StockSettings(navigator, _optimismSetting, _backupSetting, settingsUpdater)
+         '/':         (RouteArguments args) => new StockHome(args.navigator, _stocks, _symbols, _optimismSetting, modeUpdater),
+         '/settings': (RouteArguments args) => new StockSettings(args.navigator, _optimismSetting, _backupSetting, settingsUpdater)
       },
       onGenerateRoute: _getRoute
     );
diff --git a/examples/widgets/card_collection.dart b/examples/widgets/card_collection.dart
index 0e7a06c..fb0458b 100644
--- a/examples/widgets/card_collection.dart
+++ b/examples/widgets/card_collection.dart
@@ -357,7 +357,7 @@
       accentColor: Colors.redAccent[200]
     ),
     routes: {
-      '/': (NavigatorState navigator, Route route) => new CardCollection(navigator: navigator),
+      '/': (RouteArguments args) => new CardCollection(navigator: args.navigator),
     }
   ));
 }
diff --git a/examples/widgets/drag_and_drop.dart b/examples/widgets/drag_and_drop.dart
index c7a6187..f35934c 100644
--- a/examples/widgets/drag_and_drop.dart
+++ b/examples/widgets/drag_and_drop.dart
@@ -133,7 +133,7 @@
   runApp(new App(
     title: 'Drag and Drop Flutter Demo',
     routes: {
-     '/': (NavigatorState navigator, Route route) => new DragAndDropApp(navigator: navigator)
+     '/': (RouteArguments args) => new DragAndDropApp(navigator: args.navigator)
     }
   ));
 }
diff --git a/examples/widgets/navigation.dart b/examples/widgets/navigation.dart
index c9dd69b..7ade991 100644
--- a/examples/widgets/navigation.dart
+++ b/examples/widgets/navigation.dart
@@ -6,46 +6,46 @@
 import 'package:sky/widgets.dart';
 
 final Map<String, RouteBuilder> routes = <String, RouteBuilder>{
-  '/': (NavigatorState navigator, Route route) => new Container(
+  '/': (RouteArguments args) => new Container(
     padding: const EdgeDims.all(30.0),
     decoration: new BoxDecoration(backgroundColor: const Color(0xFFCCCCCC)),
     child: new Column([
       new Text("You are at home"),
       new RaisedButton(
         child: new Text('GO SHOPPING'),
-        onPressed: () => navigator.pushNamed('/shopping')
+        onPressed: () => args.navigator.pushNamed('/shopping')
       ),
       new RaisedButton(
         child: new Text('START ADVENTURE'),
-        onPressed: () => navigator.pushNamed('/adventure')
+        onPressed: () => args.navigator.pushNamed('/adventure')
       )],
       justifyContent: FlexJustifyContent.center
     )
   ),
-  '/shopping': (NavigatorState navigator, Route route) => new Container(
+  '/shopping': (RouteArguments args) => new Container(
     padding: const EdgeDims.all(20.0),
     decoration: new BoxDecoration(backgroundColor: const Color(0xFFBF5FFF)),
     child: new Column([
       new Text("Village Shop"),
       new RaisedButton(
         child: new Text('RETURN HOME'),
-        onPressed: () => navigator.pop()
+        onPressed: () => args.navigator.pop()
       ),
       new RaisedButton(
         child: new Text('GO TO DUNGEON'),
-        onPressed: () => navigator.pushNamed('/adventure')
+        onPressed: () => args.navigator.pushNamed('/adventure')
       )],
       justifyContent: FlexJustifyContent.center
     )
   ),
-  '/adventure': (NavigatorState navigator, Route route) => new Container(
+  '/adventure': (RouteArguments args) => new Container(
     padding: const EdgeDims.all(20.0),
     decoration: new BoxDecoration(backgroundColor: const Color(0xFFDC143C)),
     child: new Column([
       new Text("Monster's Lair"),
       new RaisedButton(
         child: new Text('RUN!!!'),
-        onPressed: () => navigator.pop()
+        onPressed: () => args.navigator.pop()
       )],
       justifyContent: FlexJustifyContent.center
     )
diff --git a/examples/widgets/overlay_geometry.dart b/examples/widgets/overlay_geometry.dart
index 8a52520..6aa66e9 100644
--- a/examples/widgets/overlay_geometry.dart
+++ b/examples/widgets/overlay_geometry.dart
@@ -165,7 +165,7 @@
     ),
     title: 'Cards',
     routes: {
-      '/': (navigator, route) => new OverlayGeometryApp()
+      '/': (RouteArguments args) => new OverlayGeometryApp()
     }
   ));
 }
diff --git a/examples/widgets/pageable_list.dart b/examples/widgets/pageable_list.dart
index c00da4b..e68ebbc 100644
--- a/examples/widgets/pageable_list.dart
+++ b/examples/widgets/pageable_list.dart
@@ -165,7 +165,7 @@
       accentColor: Colors.redAccent[200]
     ),
     routes: {
-      '/': (NavigatorState navigator, Route route) => new PageableListApp(navigator: navigator),
+      '/': (RouteArguments args) => new PageableListApp(navigator: args.navigator),
     }
   ));
 }