Resource channel

This implements resource channels, cockpit modules, and exposes them via HTTP. Nothing has been migrated to use them yet.

See doc/urls.md and doc/modules.md for details on how this is implemented and works.

To test, you can do the following:

```
$ mkdir -p ~/.local/share/cockpit/mymodule
$ echo '{ "description": "My module" }' > ~/.local/share/cockpit/mymodule/manifest.json
```

And then authenticate with cockpit, in a second tab go to: http://localhost/res/localhost/mymodule/manifest.json
Something like this:

```
diff --git a/src/ws/cockpitwebservice.c b/src/ws/cockpitwebservice.c
index 464f2cc..7942b8a 100644
--- a/src/ws/cockpitwebservice.c
+++ b/src/ws/cockpitwebservice.c
@@ -688,8 +688,8 @@ on_session_control (CockpitTransport *transport,
       session = cockpit_session_by_channel (&self->sessions, channel);
       if (!session)
         {
-          g_warning ("channel %s does not exist", channel);
-          valid = FALSE;
+          /* Not for us. */
+          return FALSE;
         }
       else if (session->transport != transport)
         {
@@ -751,15 +751,14 @@ on_session_recv (CockpitTransport *transport,
   session = cockpit_session_by_channel (&self->sessions, channel);
   if (session == NULL)
     {
-      g_warning ("received message with unknown channel %s from session", channel);
-      outbound_protocol_error (self, transport);
+      /* Not for us. */
       return FALSE;
     }
   else if (session->transport != transport)
     {
       g_warning ("received message with wrong channel %s from session", channel);
       outbound_protocol_error (self, transport);
-      return FALSE;
+      return TRUE;
     }
 
   /* We update the channel and remove the web socket specific channel scope here. */
@@ -772,7 +771,7 @@ on_session_recv (CockpitTransport *transport,
       g_bytes_unref (prefix);
     }
 
-  return FALSE;
+  return TRUE;
 }
 
 static void

```