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).
Yup, I understand that. My assumption is that that hit is made up by having to do far fewer rebuilds (and/or significantly mitigated by solid-state disks). Plus, although anecdotal, I do know that there are other build systems (like Sprockets/Rails Asset Pipeline) that do things this way, so it isn't completely crazy.