Cleanup of extension and application APIs

Removed embedded references to js.Proxy instances in Window and Tab, copying all of the values into fields on the Dart objects and removed the release() methods from these objects.

Made Event objects less mutable.

Creation of additional helper functions in common.dart for repeated operations:
 - convertJsonResponse: converts a JSON-representable js object to corresponding Dart objects
 - jsifyMessage: converts a Dart Object to a JS object based on its type
 - listify: converts a js Array to a corresponding Dart List

Improvements to ChromeStreamController:
 - add/remove its js Listener as Dart Listeners are added and removed from the Stream.
 - added support for specifying the return value for the js listener callback

Changed Runtime.onMessage to be a Stream<MessageEvent>

Reimplemented the test_harness background page script in Dart.