commit: Refactor recursive `GetTreeEntries()` for efficiency
This MR refactors the recursive case of GetTreeEntries()
to be more efficient. Previously, we manually walked down the tree hierarchy and asked a long-lived git-cat-file(1) process for the respective tree objects. This is quite inefficient though, and we can ultimately just ask git-ls-tree(1) to do this for us. This brings a 70% speedup and requires 30% less memory to do the same thing.
Closes #3888 (closed)