docs: public Reason wait(T waiter, long timeout, TimeUnit unit)
      {
          if (list == null)
          {
              return Reason.Release;
          }
          try
          {
              Locks.locked(lock, waiter, (w)->{list.add(w);});
              if (semaphore.tryAcquire(timeout, unit))
              {
                  return Reason.Release;
              }
              else
              {
                  list.remove(waiter);
                  return Reason.Timeout;
              }
          }