Allow creating hashes for a directory based on contents

I have a large resource directory and I want to keep my hashes file small (and so fast to load).

I've implemented support for creating hashes of directories which are calculated from the hashes of their contents. Additionally, a memoizer is used to avoid hashing the same file twice.
Is the memoizer necessary? The only case I can think of that you'd get a cache hit is probably a misconfiguration - if you'd configured the task with wildcards like `src: ['a/**/*']` in conjunction with `includeDirs: true`, then we'd descend into the subdirectories twice (once to calculate the individual file hashes, and once to calculate the combined directory hashes). But that's not the use case you proposed because you'd still end up with a bloated hashes file. If you had a directory `a` containing child directories that you wanted to hash, you'd configure `src: ['a/*']` and `includeDirs: true` and then the task would only descend into the nested dirs to calculate the combined hashes, and so would not get any cache hits.