cu-zenoh-bridge 0.13.0

Copper bridge for bidirectional Zenoh messaging.
Documentation
# cu-zenoh-bridge

Bidirectional Copper bridge over Zenoh, with multiple typed channels per bridge.

## Config

Bridge-level config:
- `zenoh_config_file`: path to a Zenoh config file (optional). This should be a JSON5 file following
  Zenoh's session configuration schema. You can start from the default config:
  https://github.com/eclipse-zenoh/zenoh/blob/main/DEFAULT_CONFIG.json5
  See the configuration docs: https://zenoh.io/docs/manual/configuration/
- `zenoh_config_json`: Zenoh config as an inline JSON5 string (optional). This is useful when you
  want to embed a small config directly in your Copper config instead of providing a file.
  The schema is the same as the JSON5 file above.
- `wire_format`: default wire format (`bincode`, `json`, or `cbor`).

Per-channel config (inside `channels`):
- `route`: Zenoh key expression for the channel.
- `config.wire_format`: override the default wire format per channel.

Example:
```ron
bridges: [
  (
    id: "zenoh",
    type: "bridges::DemoZenohBridge",
    config: {
      "wire_format": "bincode",
      "zenoh_config_file": "/path/to/zenoh.json5",
    },
    channels: [
      Tx(id: "ping_bin", route: "demo/ping/bin"), // default to bincode as per bridge config
      Tx(id: "ping_json", route: "demo/ping/json", config: { "wire_format": "json" }),
      Rx(id: "pong_bin", route: "demo/pong/bin"),
      Rx(id: "pong_json", route: "demo/pong/json", config: { "wire_format": "json" }),
    ],
  ),
],
```

Inline JSON5 example:
```ron
config: {
  "zenoh_config_json": r#"
    {
      scouting: { timeout_ms: 1000 },
      transport: { unicast: { max_links: 2 } }
    }
  "#,
}
```

The bridge uses a single Zenoh session and declares one publisher/subscriber per configured channel.