Add non mmap based db loader

This adds a non mmap based db loader to semidbm.  This allows platforms that do not have mmap available to use a simple file based loader based on `.read()`.  Part of this refactoring was pulling out the loaders into their own separate modules.

I've included some additional tools and updates to the benchmarking that makes is easier to test out the different loaders.

For the time being, creating a DBM object with a specific loader is an internal interface.  It's pretty straightforward to do, but not officially part of the public API.