Added Range, Region, and Interval types for bounds

This makes bounds inference a little clearer,
rather than relying heavily on std::vectors of std::pairs