At the very least, we will want:
data ShrinkIndex
data ShrinkTree a
makeShrinkTree :: (a -> [a]) -> a -> ShrinkTree a
lookup :: ShrinkIndex -> ShrinkTree a -> Maybe a
plus the extend and succ operations discussed previously.
Ideally tests will be provided showing that these operations behave as we expect them to.