Do some very light refactoring to make things faster in some cases.

A few consequences:

1) The md5 was being computed twice. Once in BufferedReader and once
   in md5_file since BufferedReader's file handle was an md5_file.
   I cleaned this up to reuse the underlying md5_file.
2) Check the underlying file handle of an md5_file for whether it is
   an acceptable "raw" IO handle. If so, then don't bother with
   BufferedReader.
3) Getting an md5 hex digest now uses duck typing instead of type
   reflection.