Decrease visibility of ComponentCache.getKey
Use set algebra for job dependencies
Refactor static injector class

Split the static injector out from a separate NodeInstantiator.
Refactor LensKit node instantiation and processing

- Introduce NodeProcessor interface for processing nodes
- Use it for instantiation and simulation
Expose shareable node processing w/o RecommenderInstantiator
Don't cache single-use dependencies
Make the component cache a node processor
Handle null objects in descriptions
Clean up supplier & provider equality
Refactor eval job access to task outputs
Implement job graph builder
Use job graph builder in train-test task
Remove println from verify script
Add logging to job graph merging
log in-memory caching of components