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 
So, it might be worth considering adding the `include["items"]` parameter to the list_modules call.  The doc says that if there are too many modules it might not return the items, but if it does work it would be potentially more efficient.  It would probably be a minimal change to defensively code for that, given that you're already looping through and making calls to get the items for each module.