Multi-File Packages need to unregister all classes from files
If there are any custom PropertyGroup classes in the submodules, they have to be loaded in the correct order. You also need to "unregister" the submodules.

This is a pattern in the main file

def register():
    #register operators and propertyGroups explicitly
    bpy.utils.register_class(myPGClass1)
    #and/or run a helper function that finds all the classes and registers them

    bpy.utils.register_module(__name__)

    #add to the schema
    bpy.types.Scene.myTool = bpy.props.PointProperty(type=myPGClass1)


def unregister():

    #important: delete custom schema
    del bpy.types.Scene.myTool
    #unregister_classes, or use helper
    bpy.utils.unregister_class(myPGClass1)
    bpy.utils.unregister_module(__name__)

if __name__ == '__main__':
    register()


The this should work find if everything is in the __init__.py file. But since this is not the case, then these are the issues I discovered.


register_module() just finds the bpy.types.* classes in the module and runs register_class which looks to be a python call into C. So this doesn't look in the other files. So one has to call register_class on anything defined there.
enabling and disabling scripts will find the register and unregister functions by duck-typing. But only the __init__.py file will be in the list that gets checked. So anything in unregister() will not get called. This is the del types.myType line.
even though registering and unregistering is not working. Reloading will import the submodules, thus causing erratic behavior and classes will be reregistering, and the schema will try to update from a dereferenced raw pointer.
disabling/enabling addons has more to do with marking modules with a flag than with loading and unloading modules. Loading happens on first load and reload(f8).