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 tool doesn't track whether an intervention point is installed or not, since we can't maintain an accurate state of that unless Canvas lets the tool know whenever a user installs or uninstalls an intervention point. This means we have to poll Canvas whenever we need an accurate picture of what is installed or not. `get_uninstalled_intervention_points` actually makes a call to `get_installed_intervention_points` and checks it against all intervention points tracked in the database to figure out which ones are uninstalled at that given point in time.