code: @Override
  	public Promise<T> take() {
  		assert take == null;
  		if (exception == null) {
  			if (put != null) {
  				T value = this.value;
  				SettablePromise<Void> put = this.put;
  				this.value = null;
  				this.put = null;
  				put.set(null);
  				return Promise.of(value);
  			}
  
  			this.take = new SettablePromise<>();
  			return take;
  		} else {
  			return Promise.ofException(exception);
  		}
  	}
docs: Returns a promise of current {@code value}, if
  the {@code put} is not {@code null}.
  <p>
  Sets {@code put} and {@code value} as {@code null}
  after the operation.
  <p>
  If the {@code put} is {@code null}, sets {@code take}
  as a new {@link SettablePromise} and returns it. If
  current {@code exception} is not {@code null}, returns
  a promise of the exception and does nothing else.
  
  @return a promise of the {@code value} or of {@code null}.
  If this {@code exception} is not {@code null}, returns a
  promise of exception.