Refactor ExponentiallyDecayingSample.update; add unit tests
Snapshot() takes an iterable not just a list
Replace RBTree with heapq
This removes a dependency and should be at least as efficient.  Note that there
is a subtle semantic change: duplicate priorities are now allowed.  This is
arguably the correct behavior; before a very high priority sample could be
ejected simply because of a random collision.  Now the lowest priority sample
will always be removed.
Fix rescaling
Refactor weight calculation
Determine rescale threshhold based on alpha
Fix various problems in ExponentiallyDecayingSample: replace RBTree with heapq, ensure rescale is called, set rescale_threshold based on alpha