Update Formatter#use to accept a dependency object for consistency
Add a helper method for finding the source for a cookbook
Allow Dependency#locked_version to accept a string

This commit changes the `attr_accessor` for locked_version to a simple
`attr_reader` and adds a custom writer method. This custom method will
automatically set the locked version to a `Solve::Version`; it makes
the DSL nicer.
Remove Dependency#download

This method added a lot of indirection and is actually incorrect. Users
should use `Dependency#cached_cookbook` or `Dependency#downloaded?` 
instead.
Add a helper method for converting a dependency to a hash key.

Hopefully this helper method will alleviate the weirdness that happens
when passing a dependency object versus the name of a dependency to
various methods that perform hash lookups.
Bugfix: Wait to unlock dependencies
Rename Lockfile#has_dependency? -> Lockfile#dependency?
Make the resolver return a list of dependencies instead of an triplet
Remove delegator in favor of an instance variable with attr_reader
Refactor lockfile reduction
Refactor the installer to use the dependency graph

This commit separates the installer into two installation methods:

1. Install from lockfile: this method relies entirely on the graph
   contained in the lockfile to install dependencies. This is an 
   incredible speed improvement as it removes the need for a resolver.
   As an added bonus, this installation method will not attempt to use
   the Internet if the cookbooks already exist locally.
2. Install from universe: this method constructs a new universe and
   installs cookbooks the way you normally expect, but gives extra
   preference to already-installed cookbooks.
Make the database builder more interactive
Refactor the lockfile to use a custom parser and graph object