Instead of hashing trees by mtime and size, hash by file content.

This allows for the cache to be hit far more often, especially when you are modifying the content of a file back and forth (e.g. frequent undo/redo).

Also, added an optional `digestCache` option to `hashTree(...)` which is used to prevent unnecessary file reads (if the mtime and size of the file haven’t changed, assume that we don’t need to re-read & hash its contents).
Reading the files here, is likely to cause relatively significant increase in memory and total I/O.