docs: def chain(self, token: 'CancelToken') -> 'CancelToken':
          """
          Return a new CancelToken chaining this and the given token.
  
          The new CancelToken's triggered will return True if trigger() has been
          called on either of the chained tokens, but calling trigger() on the new token
          has no effect on either of the chained tokens.
          """
          if self.loop != token._loop:
              raise EventLoopMismatch("Chained CancelToken objects must be on the same event loop")
          chain_name = ":".join([self.name, token.name])
          chain = CancelToken(chain_name, loop=self.loop)
          chain._chain.extend([self, token])
          return chain