Align the start of downsampling
Aligned the start time of downsampling by the given downsampling interval
so that the same set of data points belongs to the same downsampling period
regardless of the start time of a user-requested time range.
- Made the start time of a downsampling period its representative timestamp
  without computing the average of the timestamps of the data points of the
  period.
- Factored downsampling code out from Span.java to its own class to make it
  easier to write unit tests.
- Made the type of downsampling result double regardless of the original type
  to get rid of the loop that checked the type of the raw input data points.
  By using double, we could handle very small integers and very big integers
  within a reasonable error margin. Some values are too small to round off.
  For example, the integer average of four values (2, 2, 2, 1) is 1, which is
  far from the real average of 1.75. Some values are so big that it could
  cause long-integer overflow while downsampling.
- Factored out the piece of code that computes the rate of changes to make
  it easier to understand and test.
- Factored out the piece of code that iterates over a list of spans to aggregate.
- Added unit tests against the AggregationIter class.

Signed-off-by: Chris Larsen <clarsen@euphoriaaudio.com>
Refactor Downsampler to avoid the MutableDataPoint class and reduce method
calls.

Signed-off-by: Chris Larsen <clarsen@euphoriaaudio.com>
Modify MutableDataPoint.java to store a long or a double encoded as a long to
save a primitive that won't be used.
Rename MutableDataPoint.resetWithLongValue() and resetWithDoubleValue() to
reset().
Remove MutableDoubleDataPoint.java as it's redundant.

Signed-off-by: Chris Larsen <clarsen@euphoriaaudio.com>
Fix SeekableViewsForTest to handle the reset(long, double) overload properly

Signed-off-by: Chris Larsen <clarsen@euphoriaaudio.com>
Flatten RateSpan for efficiency.

Signed-off-by: Chris Larsen <clarsen@euphoriaaudio.com>