Return descriptive errors from bad cookbook uploads.

:fork_and_knife: 

https://trello.com/c/2DdyWZUw/283-provide-more-details-when-a-cookbookversion-s-content-type-is-invalid

This worked before at a model level, and if the attachment itself was bad, but it failed when the `Content-Type` of the request was bad.  This fixes that.
I'll also offer that I'm not a fan of the recursive approach in this case. I think it obscures what's going on; the errors we want to gather don't occur recursively. That is, some combination of the new `CookbookVersion` record, the new `SupportedPlatform` records and the new `CookbookDependency` records are invalid, but we don't need to follow any other relations to get a complete view of what's gone wrong.