cpp: tiffreader: Use index ranges for IFD cache

This is rather more efficient than caching IFDs, though it does
impose constraints upon derived readers.
cpp: tiffreader: Update docstrings