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 functions to report cache sizes
Add print_cache_size configuration parameter

If print_cache_size is True (env var PYOP2_PRINT_CACHE_SIZE), PyOP2 will
print the size of class and object caches at exit.
Add some tests of object caching