Divorced resources from artifacts and pushed caching/reuse concerns up to the resolver layer instead of the transport layer. This replaces the ResourceCollection concept with ExternalResourceRepository (which is composed of an accessor, uploader and lister). This means that we can use all of the same transport/caching/reuse logic for raw resources as well as artifacts.
The key abstraction is now ExternalResourceAccessor. It exposes: