Util_conduitutil_conduit doesn't depend on any of our modules like Crypto, Common etc., hence the type parameter on `'a Connection`. All IP addresses are `Ipaddr.t` and ports are `int`.
type 'a mk_peerkey := Mirage_crypto_ec.Ed25519.pub -> 'a peerkeymodule Connection : sig ... endtype 'a connection = 'a Connection.tval ip_port_of_conn_exn : 'a connection -> Ipaddr.t * intval open_client_connection : 
  ?info_str:string ->
  ?server_fingerprint:(Mirage_crypto.Hash.hash * Cstruct.t) ->
  ?client_auth:[ `None | `Cert of string * string ] ->
  string ->
  Ipaddr.t ->
  int ->
  'a mk_peerkey ->
  'a connection Lwt.tval start_server : 
  ?info_prefix:string ->
  ?openssl_cmd:string list ->
  string ->
  string ->
  Ipaddr.t ->
  int ->
  'a mk_peerkey ->
  ('a connection -> unit Lwt.t) ->
  unit Lwt.tval send_s : 'a connection -> string -> unit Lwt.tval send : 'a connection -> 'b Seaboar.Encode.encoder -> 'b -> unit Lwt.tval send_terminate_message : 'a connection -> unit Lwt.tval close_connection : 'a connection -> unit Lwt.tval key_fingerprints_authenticator : 
  string ->
  (Mirage_crypto.Hash.hash * fingerprint) ->
  X509.Authenticator.tval mk_prf : ?prepend:string -> ?append:string -> 'a connection -> 'b fmt