Fix hot reload failure handling
diff --git a/packages/flutter_tools/lib/src/flx.dart b/packages/flutter_tools/lib/src/flx.dart
index 7b01689..d28e65c 100644
--- a/packages/flutter_tools/lib/src/flx.dart
+++ b/packages/flutter_tools/lib/src/flx.dart
@@ -211,7 +211,7 @@
   // splitting each one into each component license (so that we can
   // de-dupe if possible).
   final Set<String> packageLicenses = new Set<String>();
-  final List<Uri> packages = packageMap.map.values;
+  final Iterable<Uri> packages = packageMap.map.values;
   for (Uri package in packages) {
     if (package != null && package.scheme == 'file') {
       final File file = new File.fromUri(package.resolve('../LICENSE'));
diff --git a/packages/flutter_tools/lib/src/observatory.dart b/packages/flutter_tools/lib/src/observatory.dart
index bc6a315..c04c9b9 100644
--- a/packages/flutter_tools/lib/src/observatory.dart
+++ b/packages/flutter_tools/lib/src/observatory.dart
@@ -114,17 +114,13 @@
     });
   }
 
-  Future<Response> reloadSources(String isolateId) async {
-    Completer<Event> whenIsolateReloads = new Completer<Event>();
-    StreamSubscription<Event> sub = onIsolateEvent
-      .where((Event event) => event.kind == 'IsolateReload')
-      .listen((Event event) => whenIsolateReloads.complete(event));
-
+  Future<Null> reloadSources(String isolateId) async {
     try {
-      await sendRequest('_reloadSources', <String, dynamic>{ 'isolateId': isolateId });
-      return await whenIsolateReloads.future.timeout(new Duration(seconds: 20));
-    } finally {
-      await sub.cancel();
+      await sendRequest('_reloadSources',
+                        <String, dynamic>{ 'isolateId': isolateId });
+      return null;
+    } catch (e) {
+      return new Future<Null>.error(e.data['details']);
     }
   }
 
diff --git a/packages/flutter_tools/lib/src/run.dart b/packages/flutter_tools/lib/src/run.dart
index 959364d..d261c70 100644
--- a/packages/flutter_tools/lib/src/run.dart
+++ b/packages/flutter_tools/lib/src/run.dart
@@ -378,13 +378,14 @@
       await _updateDevFS();
     }
     Status reloadStatus = logger.startProgress('Performing hot reload');
-    Event result = await observatory.reloadSources(observatory.firstIsolateId);
-    reloadStatus.stop(showElapsedTime: true);
-    dynamic error = result.response['reloadError'];
-    if (error != null) {
-      printError('Error reloading application sources: $error');
+    try {
+      await observatory.reloadSources(observatory.firstIsolateId);
+    } catch (errorMessage) {
+      reloadStatus.stop(showElapsedTime: true);
+      printError('Hot reload was rejected:\n$errorMessage');
       return false;
     }
+    reloadStatus.stop(showElapsedTime: true);
     Status reassembleStatus =
         logger.startProgress('Reassembling application');
     await observatory.flutterReassemble(observatory.firstIsolateId);