Return tuple of iteration regions (not list)
Add an ObjectCached class

Objects can inherit from this class if they should be cached on another
object (for example, Maps on Sets).
Add object cache to Sets
Cache MixedSets on their first constituent Set

Rather than building a new mixed set each time we hit the constructor,
cache MixedSet instances on a Set, such that equality is identity for
MixedSets.
Cache DataSets on the Set they're built on
Cache MixedDataSets on the first Set they're built on

We could cache on the DataSet, but that's equivalent to the Set, so for
simplicity just go directly to the Set.
Add object cache to Maps
Map equality is identity
Fix Map.__le__ to handle SparsityMaps
Cache SparsityMaps on the Map they're built on
Add repr and str to SparsityMap
Add SparsityMap.__le__
Cache MixedMaps on the first Map they're built on
Fix docstring of MixedMap.__le__
Cache Sparsities on the constituent row Set
Add utility function to report cache sizes

Additionally, add configuration parameter print_cache_sizes (env var
PYOP2_PRINT_CACHE_SIZES).  If True, PyOP2 will print the sizes of caches
on exit.
Add some tests of object caching
Add manual section on caching
Merge pull request #351 from OP2/feature/object_caches

Turtles all the way down.

- Set and Map equality is identity (we always had this for sets)
- All objects built on top of either sets or maps are cached on one of
  these immutable objects
- Add documentation on caching strategies
- Add utilities to debug cache leaks (show cache size at exit)
Make IR objects hash consistently

Hash IRs based on the generated code.