make course progress API more resilient

fixes CAT-517

Issue: The information stored in ContextModuleProgression#requirements_met
is not always completely accurate due to edge cases that result from
moving module items between modules. This was leading to cases where
the value returned by the API for requirement_count was actually lower
than the requirement_completed_count. This fix makes it so that duplicate
requirements_met are filtered out.

Test plan:
 1. As a teacher, make a couple of Modules and add a couple Module Items
    to each. Set up completion requirements and require sequential progress.
 2. As a student, complete a couple of module items.
 3. Verify the info returned from the course progress API is as expected.
 4. As a teacher, shuffle module items around a bit (e.g. move items from
    Module 1 into Module 2).
 5. As a student, complete the same module items you completed before.
 6. Ensure the info returned from the course progress API still reflects
    actual student progress.

Issue #2: A module with no requirements should not cause an API error.
Issue #3: A module structured as follows:

 Module [published]
  Module Item 1 [unpublished]
  Module Item 2 [published]

Should return a next_requirement_url for Module Item 2, rather than nil.

Change-Id: I93ad9e3877ca56806f87c71207e156731510033b
Reviewed-on: https://gerrit.instructure.com/40942
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Jeff Belser <jbelser@instructure.com>
Product-Review: Adam Phillipps <adam@instructure.com>
QA-Review: Adam Phillipps <adam@instructure.com>