ws: Simplify SSH terminate process test

Trying to solve some CI issues in this test

Closes #691
Reviewed-by: Marius Vollmer <marius.vollmer@redhat.com>
ws: Handle 'Connection reset by peer' ssh message

Unfortunately we have to "screen scrape" to figure out the reason
for SSH errors. So add one more message here.

Closes #695
Reviewed-by: Marius Vollmer <marius.vollmer@redhat.com>
web: Container action buttons now in panel-heading

Fixes #648

Reviewed-by: Stef Walter <stefw@redhat.com>
web: Refactors layout by moving inline styles to external stylesheet

Fixes #648
Reviewed-by: Stef Walter <stefw@redhat.com>
web: Fixes formatting of the terminal to line up with panel buttons

Fixes #648
Reviewed-by: Stef Walter <stefw@redhat.com>
web: Fixes margins of Image label and buttons

Fixes #675
Reviewed-by: Stef Walter <stefw@redhat.com>
web: Fixed the html indentation

Reviewed-by: Stef Walter <stefw@redhat.com>
ws: Better debug logging when removing a channel from session
agent: Split out MockTransport into its own file

And move some tests to start using it.
common: Add cockpit_assert_bytes_eq() and cockpit_assert_data_eq()

These functions are used in tests to check if memory matches expected
and gives informative output if it doesn't match. This output could
be further enhanced to show a diff or some such, but for now it's just
a simple escaped listing.
agent: Add cockpit_channel_close_obj_option() function

This allows adding full JSON objects to channel close messages.
agent: Implement agent support for modules and resource1 payload

This adds support to cockpit-agent for listing and loading module
resources.

See doc/modules.md for information about how modules are laid
out on the system.

doc/protocol.md contains information about the resource1 payload
ws: Add cockpit_web_response_abort() to stop streaming response

When we are streaming a web response, and half-way an error occurs
and we cannot get the remaining data to stream, we need to terminate
the web response.

cockpit_web_response_abort() does this by just disconnecting the
web response. The caller should be able to tell whether the data
is incomplete based on length header or chunking.
ws: cockpit_web_response_get_state() and expose web response state

Allow others to see what state a web response is currently in.
This helps prevent callers from having to carry around the identical
state.
ws: Strip query string when handing HTTP requests

We never use a query string, and some callers like jQuery add one
automatically in certain cases.
ws: Change how CockpitWebServer handle-resource signal detail works

To match subtrees, connect using detail handle-resource::/component/, to
match actual to level paths use detail handle-resource::/component
ws: Expose resources from remote hosts via HTTP

The resources are under the /cache and /res paths. See doc/urls.md
for more information.

We stream these from cockpit-agent using channels with payload
type resource1.

We also track when the web service requests checksum and module
listing information, and keep track of which host has which checksums
so we can send requests appropriately later.
ws: Serve the / HTTP path with its own handler

Since the response to / cannot be aggressively cached, unlike almost
everything else ... include dynamic content right in the response to
minimize server round trips.

Removed the unused avatar data url. If we do want an avatar on
the login page, it should be retrieved as a normal image and have
its own handler.
ws: Handle favicon.ico and apple-touch-icon.png separately

These don't get handled via /static or the later resource1
payload channel. These are special cases.
ws: Transfer login, module, host info using environment block

This is a JSON block called the environment which is used to pass the
necessary information to start up cockpit. It is received by the
javascript.

When not yet logged in, the environment contains very little
information, once logged in it is fully populated.

The environment is seeded in the '/' index handler, to avoid multiple
round trips. If a login occurs, then the full environment is transferred
as a response to the '/login' request.