Add support for mixed case filenames

This pull request is in *addition* to pull request #29.  Please consider pull request #29 first.

This change makes lowercase filenames optional.  I'd personally prefer to see mixed case files, and leave the sorting up to the client.  With this change, the case is maintained internally.  There's a --lowercase option that creates a transform on the filenames (namely, calling lower()) just for the returning directory entries.

I also defined a few classes here, in part because it helped abstract this change by hiding transformations via lower() and the like.  I think the end result is somewhat more "properly abstracted" code and whatnot.  It could still be taken further, but I think it's a step forward.