This is done by stepping through a branch iterator to diff commits to
see where they changed. This is somewhat computationally intensive,
and also doesn't work well yet because iterator stepping is done
internally and there is no API to extend iterators before they are
run. That means that histories can only be read from first-parent
iterators.
Ideally we would do two things here:
1. build an API to let iterators extend themselves, either breadth
first, or depth first. But maybe that would be too much
complexity for the iterator module?
2. figure out a better way to get the history of a file. At the
moment we are stepping through commits and diffing them with
parents to find the set of changed paths. I don't _think_ there is
a way to simply compare refs, but maybe there is.