WIP: implement group access enforcement in courseware

@andy-armstrong @cahrens 

@dmitchell @cpennington - FYI - some performance optimizations still being worked on in here, but would appreciate any feedback / guidance on the overall logic which isn't planned to change.
It seems expensive to me to have to dynamically create this dict on each access check. It could be that most of the dict is irrelevant for the current query. I was expecting this to be a recursive access check, and since most blocks will have no group access set it should be a noop at most levels. Let's discuss in person.