Will/grady/self assessment feedback

@wedaly , we should talk about the Test changes and the changes to models/base.py
I'd really prefer to separate these test cases out.  This test contains too much test-specific logic, so it's hard to see how the application code is being exercised.  It also relies on parsing the exception string, which could change in the future, breaking this test.

Instead, try:
1) Making a helper function that encapsulates most of the setup logic.  Something like:
```
def _setup_rubric(has_option_selected=False, has_options=False, has_feedback=False):
```

2) Use the `ddt.data` decorator to parameterize the test case for each combination of those variables.

This will make the test case much shorter, which is easier to understand and maintain.  It should really be this short:
```
@ddt.data(...)
def test_check_all_criteria_assessed(self, data):
    self._setup_rubric(has_option_selected=data[0], has_options=data[1], has_feedback=data[2])
    with self.assertRaises(SelfAssessmentRequestError):
        create_assessment(...)
```