Fix for #16455

This reverts 5fdd86, which introduced a self-referential dictionary-- which mean that it could never be garbage collected.
Wrap the split modules in objects, so we can avoid the attr/value ordering problem
Move to use lambda, to keep pylint happy
Merge remote-tracking branch 'upstream/pr/16557' into 2014.7