move the validations for error_class and environment from Err to Problem

Problems are the models rendered in the UI now, not Errs. Errs are functioning as a glorified hash table. It makes more sense to validate problems.

Also, this paves the way for the next commit, so that no functionality is lost in the subsequent refactor.
Errs are like a hash table whose values are arrays of notices and whose keys are a composite of error_class + component + action + environment + backtrace[0..3].

These fields no longer need to be cached separately on Err because they are now cached on Problem.

This commit combines all those values into one simple key: fingerprint. This should:

 - Make err lookups faster
 - Make it easier to reason about, test, and replace the fingerprint algorithm
 - Make the relationship between Problems, Errs, and Notices clearer