Eliminates duplicate Canvas API calls

- A large amount of the changes is moving code chunks from controllers.py to canvas.py
- Some of the code chunks moved has been updated with a few line changes
- Imports updated to reflect changes

Overview: This moves the controller functions that have common calls to the Canvas API into its own class, CanvasModules, now located in canvas.py. As a result of this, we remove duplicate calls to the Canvas API in some of our view function and simplify the parameter set that these controller functions need to take.

@zags 
The logic in `get_modules_with_items` is different from the logic in the `__init__` method.   The method `get_modules_with_items` is doing some extra processing and attaching other pieces of information to `self.modules` before returning it, while the `__init__` logic does the data fetching from Canvas to populate the shared `self.modules` used by all the methods here. The reason logic is separated is because `get_modules_with_items` makes a database call in line 61 with `self._all_intervention_point_urls()` in order to do the extra processing on `self.modules` i.e. because database calls are considered expensive and because the mentioned processing is superfluous to the other methods in the class that use `self.modules`, the logic is separated.