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).
I guess what is not clear to me, is why what we are doing now is unacceptable.  Are there actual scenarios where the `stat.mode`, `stat.mtime`, `stat.size`, and `relativePath` does not already provide sufficient caching?  Especially when we have symlinks (and we do not need to us `fs.utimes` to ensure copied files have the same `mtime`).

Also, in general, I would prefer to be **better** than the asset pipeline if at all possible (not shadow it).