Refactor the lockfile to separate top-level dependencies from the graph
Only list group-specific dependencies

This commit changes the airty of a number of methods that previously
accepted a list of :only, and :except options. These options are now
honored when the Berksfile object is created, rather than on each method
call.

This is a required change in order to preserve the correct dependency
groups in the lockfile between runs. Otherwise, the Berksfile has no
context of the "true" list of dependencies it needs to install and
manage.
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
Apply environment locks using the graph
Pass in the list of cookbook names for the uploader
Add helper methods for checking the existence of a dependency/lock
Add fixtures for testing lockfile parsing
Issue a warning when the lockfile is empty