docs: def run(self):
          '''The main entry point of a :mod:`jcn`-based application. :meth:`run`
          sets up the terminal and then runs then event loop, continually
          responding to user input and drawing UI element to the screen when
          required.
  
          Specifically, :mod:`jcn` applications run the terminal full-screen and
          with the cursor hidden, and set :attr:`sys.stdin` to unbuffered and
          non-blocking so that we can respond immediately to any keystrokes from
          the user. We also correctly handle being suspended (:kbd:`Control-z`,
          SIGTSTP) and resumed, and the terminal window being resized.
  
          We run :mod:`asyncio` event loop inside context managers that will
          handle exceptions gracefully and return the terminal to the previous
          state before exiting. Aren't we nice ;-)
          '''
          with self.terminal.fullscreen(), self.terminal.hidden_cursor(), (
                  self.terminal.unbuffered_input()), (
                  self.terminal.nonblocking_input()), (
                  self._handle_screen_resize()):
              def read_stdin():
                  data = self.terminal.infile.read()
                  unhandled_input = self.element.handle_input(
                      self.keyboard[data])
                  if unhandled_input:
                      self.handle_input(unhandled_input)
              if self.terminal.infile.isatty():
                  self.loop.add_reader(self.terminal.infile, read_stdin)
              self.draw()
              self.loop.run_forever()