base: Provide cockpit.transport.origin property

This is the same as window.location.origin, but we cannot rely
on the latter, since it is not supported by Internet Explorer,
even version 10.

Add documentation and tests.
base: Implement transport.filter() and transport.inject()

These methods allow one to filter incoming messages and inject
outgoing messages. Needed when forwarding WebSocket via another
web frame.
ws: Cleaner channel-seed suffix

channel-seed should generally be used as a prefix. So add a
separator in to the mix from the very start.
base: Expose the transport options from the "init" message

This is similar to exposing channel.options. Necessary for forwarding
WebSocket to another iframe.
base: Channels to the right host provided by the init message

The default-host is now carried by the init message. We use this
to determine the default "host" field in channels.
base: Send cockpit protocol via parent frame where possible

Instead of each frame opening up their own websocket, send
messages via the parent frame if possible.
shell: Relayout the containers page

Fixes #1395
Reviewed-by: Marius Vollmer <marius.vollmer@redhat.com>
shell, base: Move cockpit.hash into base.
base: API for hash tracking and setting.

Also, move the old cockpit.location temporarily out of the way.
shell: Use new API for hash tracking and setting.
test: Properly wait until iframe is loaded before switching to it.
shell: Load external pages from target host.
shell: Track navigation in external pages.

And add some toy navigation to the playground.