The current timeout semantics are a little "magical":
- 0 means to block forever
- negative numbers cause the close to complete immediately without checking the state
I think this would make more sense:
- reject negative numbers
- make 0 just signal and return immediately (after checking the state once)
- if I want to wait "forever", I can use ofYears(1) or ofMillis(Long.MAX_VALUE) or some other intuitively "long enough to be forever" value instead of a magic value.