chef-client should never send negative values for duration to reporting; fixes 1765

The duration can be negative if a resource changes the system's time.
We should return 0 duration instead to indicate that something unusual happened.
Ensure reported elapsed_time is nonnegative.
don't return negative time
Return values with Time class after stubbing :now of Time.
Update CHANGELOG with information about bug fix.
Convert CookbookLoader spec to let bindings
Add unit tests for CookbookVersionLoader
Respect metadata name attribute

Fixes CHEF-3307
Remove assumption that cookbook names match dirnames in CookbookLoader

Cookbooks are now loaded with a "preload" step that reads cookbook
metadata to determine the name. Cookbooks are fully loaded later.
Encapsulate cookbook loader map with methods
Use accessors in preference to ivars in CookbookVersionLoader
Use more explicit "inferred cookbook name" for variable
FIXME: stub specs for CHEF-2923 regression tests
Ignore non-critical errors when finding the cookbook set

https://tickets.opscode.com/browse/CHEF-2923

When running `knife cookbook upload SPECIFIC_COOKBOOK`, errors in
metadata files for unrelated cookbooks should not be raised; however, we
must evaluate the metadata for all cookbooks in order to allow the
metadata `name` attribute to be different from the cookbook directory's
basename. Therefore, we must tolerate errors in metadata.rb and re-raise
them only when attempting to load the cookbook with the invalid
metadata.
Fix ruby warning in metadata class
Fix ruby warning in metadata unit test
Convert metadata specs (mostly) to let bindings
Remove cookbook as argument to Metadata's constructor

Now that a cookbook's name must be specified in the metadata, metadata
is always created before the cookbook version object, so it should not
accept a CookbookVersion in the constructor.

The remaining arguments to the constructor are also removed. A survey of
this codebase and a search of GitHub shows that these arguments were
never used anywhere, and they were quite odd.

Additionally, the default license field is set to "all rights reserved",
which is a safe value. The filler values of maintainer and
maintainer_email have been removed, and now default to nil. This will
make it easier to validate that the user has set these values.
Add validation to Metadata

exposes #valid? and #errors methods to check validity.
Make `name` a required attribute in metadata