Changes interval from tuple to struct
Changes contract_interval to modify an interval directly
Removes unused *_half methods
Reworks how decoding works significantly:

- Adds decode_vec helper
- Add Interval#contract method to replace contract_interval
- Changes contract method to use an enum instead of bool

In addition, this commit changes decode significantly.  Rather than iterating once through the characters of a hash and then akwardly decoding the bits for each character then applying the appropriate contractions, the new method uses closures to apply the contraction and builds up a single vector of bits for the whole hash