Devoncarew deploy web

This:
- adds the ability to run a dart chrome app locally on a non-dartium chrome
- adds the ability to deploy a dart chrome app to a remote device
- some preliminary work to 'deploy' a web app (dart or non-dart) to a device. Currently this displays a message to the user with instructions to them about how to connect to our web server from their device.

And more specifically:
- create a common `resolvePath` method
- change the deploy action to go through our launch framework; it works very similar to run now
- add launch handlers for deploying chrome apps and deploying web apps. The web app handler displays a message to the user about how to set up their device. The chrome app handler delegates back to the original deploy dialog.
- add a dart chrome app launch participant which copies the `/packages` directory contents down to `<dir>/packages` as part of the launch process. Also, compile the dart code to JS iff the JS is not up to date wrt to the dart source code, and the launch target is not dartium.
- add a default favicon if none is provided by the web app
- add a way to get the localhost IP, so we can display it (and ther server's port) to the user
- make the dialog help text selectable, so users can copy the help text out (this can now contain urls)

@keertip, @dinhviethoa

Some future work:
- add a dart chrome app sample
- work on the adb code so that we can set up a reverse proxy back to our web server automatically. We can then remote the explanation dialogs on web app deploy
This is an odd corner-case of JS interop. See the `setContents` just above. Not sure if it is still the case but we has been getting objects returned here that weren't always `Metadata` instances. This caused problems in checked mode, but ran fine in non-checked mode. Hence we aren't using type annotations here.