The short answer to your last q is that you could make your defs as single files, store them in packages, and promote them into their package namespace. If your rigging package’s init.py looked like this, and your defs were in their single files in the same folder:
from .findDeformer import findDef #note leading period
from .duplicateDeformer import dupDeform
other code does not need to know why it’s set up that ways, it just calls
import rigging
rigging.findDef (.....)
This works (i use this sort of tricks for plugin-like setups where it’s nice to keep code in files organized around the different plugin, even though the outside code doesn’t want to know which plugins are present).
However, it’s not a great way to work on any significant scale. If you accidentally omit an import in init.py, your defs will vanish without a trace.
Moreover you’ll be asking python to import and compile hundreds or possible thousands of individual scripts (I just grepped for ‘def’ in my source tree and got 6,305 hits). Since the compilation is disk-IO bound you’ll probably see noticeable slowdowns (and you’ll have to compile every one of those defs just to get at one of them in a big namespace like ‘rigging’.
And, of course, you’ll have trouble nesting things effectively, since moving defs around will require un-importing them in one place and re-importing them in another. You’ll need to invent a bunch of private naming conventions to avoid re-using obvious words in your def names, leading to funky code that’s hard to read. And, worst of all when you debug you’ll need to make multiple stops to get to the real source of your code.
As an aside, if you’re worried about finding things and staying organized, use a real IDE (Eclipse or Wing) which will show you how your project is organized graphically (and autocomplete makes accessing.nested.names a breeze!).