Compressed range storage.

Idea: We add an additional node type which represents an interval
[start, end] (containing both end points) all mapping to a single
value. These can be created much more cheaply than the normal intmap
representation of such a map. In all cases where we can do this it
will be much more memory efficient. In most cases where we can use
this it's a huge performance win. Unfortunately the generality of our
union interface means that it can't be as much of a performance win
as we'd like it to be, but nevertheless in cases where you're operating
on lots of maps with the same key value in many cases this will
also produce a huge speedup.