Program module tweaks

Change individual program modules to be proxy classes instead of
abstract base classes. (Abstract base classes are for inheriting from;
proxy classes are for extending Python behavior. Program modules want
the latter.)

Change module extensions to be specified using a classmethod, rather
than by inheritance. This is because proxies aren't allowed to inherit
from multiple model classes.
Tweaks to the program module tweaks

Change behavior of ProgramModuleObj.fixExtensions(): rather than
update the instance dict with all of the module extension attributes,
just add one attribute which points to the module extension itself.

Also, make extensions() return a dict: key -> ext_class rather than a
list of ext_class. The key will be used to name the attribute that
points to the module extension.

This will break existing code that tries to access module extension
attributes directly as module attributes.
Add __getattr__ method for backward compatibility

If code tries to access attributes of a module_ext directly as
attributes of the module, let it work but raise a DeprecationWarning.
Fix code accessing module_ext attributes directly from modules

Bring existing code into compliance with the change in 3afe965b.
Rename inaccurate variable name teacherclsmodule

(and fix inaccurate comment)
Merge pull request #1232 from learning-unlimited/lua-program-modules

Program module tweaks