Add student submission reports, management and dashboard functionality

@jrbl If you wouldn't mind taking a look.
Is calling .index() repeatedly here better than prepping a name: index mapping at the top of the function one time? I think that, if you have a lot of repeated lookups for the same student, prepping a dictionary will end up being lots cheaper. Something like:
```
student_cols = dict( ((y,x) for x,y in enumerate(students) ) )
``` 
at the top, and then
```
answers[student_cols[module.student.username]] = pretty_answers
```
down here.