Macros and behaviours for client implementations
@callback do_init(any()) :: %{client_name: atom(), registrations: map()}