Change the implementation of `ConfigurableFileCollection.finalizeValue()` so that only the locations are finalized, not the set of files. For example, when a collection contains a `FileTree` that is backed by a directory, then changes to the directory are reflected in the contents of the collection. In this way, a finalized file collection is basically a finalized set of file system roots, not a finalized set of files.
Separate out some shared behaviour from the `FileCollectionResolveContext` implementations. Apply this shared behaviour only to those file collections that need to resolve arbitrary user provided paths, and simplify the contract for `FileCollectionResolveContext`.