done, Bound can now represent an absent bound, which now gets returned here instead of null.

Bounds do not have upper / lower state, rather they are tied to Intervals as their upper or lower bound.  How would the Interval constructor specify in a type-safe way that it takes one upper and one lower bound?  You would have to introduce LowerBound and UpperBound classes, which seems overkill.  The main advantage being you could do:

```dart
bool upperBounds(T value);
```

instead of:

```dart
bool upperBounds(T value);
bool lowerBounds(T value);
```

The usefulness of Bound is in dynamic and composable Interval construction, for example transforming an interval to one which is no longer bounded above, or expanding it's bound by some amount, but keeping the same open / closedness.  And the Bound.open/closed/absent constructors allow one to be explicit, instead of passing 4 independent values to the Interval constructor.