graph BT
  raw_handle[zx_handle_t]
  owned_handle[zx::Handle]
  owned_channel[zx::Channel]
  client_end[ClientEnd<TicTacToeMarker>]
  async_channel[AsyncChannel]
  proxy[TicTacToeProxy]

  raw_handle-- zx::Handle::from_raw() -->owned_handle
  owned_handle-- .into_raw() -->raw_handle

  owned_handle-- zx::Channel::from() -->owned_channel
  owned_channel-- zx::Handle::from() -->owned_handle

  owned_channel-- AsyncChannel::from_channel() -->async_channel
  async_channel-- .into_zx_channel() -->owned_channel

  owned_channel-- ClientEnd::from() -->client_end
  client_end-- .into_proxy() -->proxy
  client_end-- .into_channel() -->owned_channel

  async_channel-- Proxy::from_channel() -->proxy
  proxy-. ".into_client_end()" .-> client_end
  proxy-. ".into_channel()" .->async_channel

  %% following edges help disambiguate clientend and proxy in layout
  client_end ~~~ async_channel
  async_channel ~~~ client_end
  client_end ~~~ owned_channel
  owned_channel ~~~ client_end