Validate CookbookVersion on Cookbook

A Cookbook should not be allowed to exist if it doesn't have a
CookbookVersion. This adds validation to satisfy this requirement. Some
specs and logic are required to change to account for this new
requirement as we cannot allow Cookbook to get into a persisted state
without having a CookbookVersion. As Cookbook and CookbookVersion are
now circular dependencies this requires a bit of odd dancing around the
validations in some cases, there may be a better solution to this but
this at least protects us from the giant hurt of invalid data.