An implementation of DatedValue that can efficiently produce the value
at a given date. The following illustration shows a conceptual view of
a small ValueByDate where the "dates" are integers and the values are
characters:

In the above picture, the dated value contains the following values for the following ranges:

[1,2): K
[2,3): M
[3,5): A
[5,6): B
[7,9): M

This implementation is serializable and cloneable; however, it is not
synchronized. To use it safely in a multi-threaded situation, wrap an
instance of the dated object with a call to DatedCollections.synchronizedDatedValue.

dateIterator

Returns an iterator of the date ranges of when this dated object has changed,
starting at the range that contains the specified date.
Throughout a range returned by the iterator, the state of the dated
object must be the same. Also, the states of the dated object must
be different in two consecutive ranges returned by the iterator.
There are no gaps in the ranges returned by the iterator. That is,
if a previous date range exists, then a call to nextFrom returns the
same date as previousTo.
Passing null as the argument will return an iterator positioned
at the beginning of the sequence.

get

Returns the value at a specified date. It returns null
if no value has been set for that date. Thus, it is impossible to
distinguish an unset value and a set value of null. If
such a distinction is necessary, the client can use a special marker
value instead of null to signal a null value.