Fixed: Can set earlier due date as an individual due date extension and related bugs

This pull request fixes [LMS-6563: Can enter in earlier date in Individual Extension](https://openedx.atlassian.net/browse/LMS-6563), which was also mentioned in the individual due date extensions feature PR #2062.

Now an error will occur if the instructor attempts to set a due date that is earlier than the original due date.

I also fixed two related bugs that I noticed while working on this:
* The API would allow setting a due date extension on a unit that had no due date at all. This now returns an error.
* If one set an individual due date extension, then deleted the original due date, an Internal Server Error (500) would occur when deleting the due date extension, and neither a success nor failure message would be shown to the user.

Unit tests are included.

This was done for OpenCraft ( cc @antoviaque ) and falls under their organization contributor agreement.
Re coverage: I'll add a test for case 1 right away. I'd also like to add a test for case 2, since it was actually breaking the UI and causing a 500 error. My attempt at a case 2 test is below, but unfortunately this test is not correct because it will pass even without my fix - see my inline comment below for an explanation. Any pointers on why the `week1.save()` seems not to work, or if there's a better way to write a test for this?

```python
    def test_reset_deleted_date(self):
        """
        Test that we can delete a due date extension after deleting the normal
        due date, without causing an error.
        """
        self.test_change_due_date()
        self.week1.due = None
        self.week1.save()
        # Here week1 should have no "normal" due date
        # and one vestigial individual due date extension.
        # However, the API call below still sees the
        # normal due date which I just tried to delete.
        # Is a "publish" or a cache reset needed here?
        url = reverse('reset_due_date', kwargs={'course_id': self.course.id.to_deprecated_string()})
        response = self.client.get(url, {
            'student': self.user1.username,
            'url': self.week1.location.to_deprecated_string(),
        })
        self.assertEqual(response.status_code, 200, response.content)
        self.assertEqual(
            None,
            get_extended_due(self.course, self.week1, self.user1)
        )
```