Improve stack traces for error responses.

This tracks the stack chain when the request is made and uses it if the
response fails.

R=rnystrom@google.com

Review URL: https://codereview.chromium.org//1341933002 .
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7de0e87..524cbad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
 * Fix a race condition in `Server` where a `StateError` could be thrown if the
   connection was closed in the middle of handling a request.
 
+* Improve stack traces for error responses.
+
 ## 1.1.1
 
 * Update the README to match the current API.
diff --git a/lib/src/client.dart b/lib/src/client.dart
index 763a987..951f927 100644
--- a/lib/src/client.dart
+++ b/lib/src/client.dart
@@ -28,9 +28,8 @@
   /// Each element is a JSON-serializable object.
   List _batch;
 
-  /// The map of request ids for pending requests to [Completer]s that will be
-  /// completed with those requests' responses.
-  final _pendingRequests = new Map<int, Completer>();
+  /// The map of request ids to pending requests.
+  final _pendingRequests = new Map<int, _Request>();
 
   /// Returns a [Future] that completes when the connection is closed.
   ///
@@ -97,7 +96,7 @@
     _send(method, parameters, id);
 
     var completer = new Completer.sync();
-    _pendingRequests[id] = completer;
+    _pendingRequests[id] = new _Request(completer, new Chain.current());
     return completer.future;
   }
 
@@ -174,15 +173,15 @@
   /// resolved.
   void _handleSingleResponse(response) {
     if (!_isResponseValid(response)) return;
-    var completer = _pendingRequests.remove(response["id"]);
+    var request = _pendingRequests.remove(response["id"]);
     if (response.containsKey("result")) {
-      completer.complete(response["result"]);
+      request.completer.complete(response["result"]);
     } else {
-      completer.completeError(new RpcException(
+      request.completer.completeError(new RpcException(
             response["error"]["code"],
             response["error"]["message"],
             data: response["error"]["data"]),
-          new Chain.current());
+          request.chain);
     }
   }
 
@@ -201,3 +200,14 @@
     return true;
   }
 }
+
+/// A pending request to the server.
+class _Request {
+  /// The completer to use to complete the response future.
+  final Completer completer;
+
+  /// The stack chain from where the request was made.
+  final Chain chain;
+
+  _Request(this.completer, this.chain);
+}