docs: async def start(addr, env_cls, mgr_cls, *env_args, **env_kwargs):
      """`Coroutine
      <https://docs.python.org/3/library/asyncio-task.html#coroutine>`_ that
      starts an environment with :class:`mgr_cls` manager agent.
  
      The agent will connect to *addr* ``('host', port)`` and wait for commands
      to spawn new agents within its environment.
  
      The *env_args* and *env_kwargs* will be passed to :meth:`env_cls.create()`
      factory function.
  
      This coroutine finishes after manager's :meth:`stop` was called or when
      a :exc:`KeyboardInterrupt` is raised and calls :meth:`env_cls.destroy`
      before it finishes.
  
      :param addr:
          (HOST, PORT) for the new environment
  
      :param env_cls:
          Class of the environment, subclass of
          :class:`~creamas.core.environment.Environment`.
  
      :param mgr_cls:
          Class of the manager agent, subclass of
          :class:`~creamas.mp.EnvManager`.
      """
      env_kwargs.update(as_coro=True)
      log_folder = env_kwargs.get('log_folder', None)
      env = await env_cls.create(addr, *env_args, **env_kwargs)
      try:
          manager = mgr_cls(env)
          env.manager = manager
          await manager.stop_received
      except KeyboardInterrupt:
          logger.info('Execution interrupted by user')
      finally:
          await env.destroy(folder=log_folder, as_coro=True)