docs: public <T> void waitAbortable(Future<T> task) throws IOException, InterruptedException {
          while (!task.isDone() && !task.isCancelled()) {
              Char c = readIfAvailable();
              if (c != null && (c.asInteger() == Char.ABR ||
                                c.asInteger() == Char.ESC)) {
                  task.cancel(true);
                  throw new IOException("Aborted with '" + c.asString() + "'");
              }
              sleep(79L);
          }
      }