(Maint) Allow File to work on ruby 1.8 and 1.9

Ruby 1.8 does not have the same ::File constants as ruby 1.9
(specifically it did not have ::File::BINARY). Instead of using those
constants, the File abstraction will instead use the character-based
file modes (r, r+, w, w+, wb, etc.).

Pathname on ruby 1.8 also does not support binread. To deal with this,
the File now has 2 subclasses File18 and File19 to handle the
differences on the different systems. The File::new method is now a
factory for the appropriate subclass.
(Maint) Improve readability

if ... else ... end was a bit verbose. Ternary conditional is shorter
and easier to read.
(Maint) Compare filebucket contents with streams

The old code required that we completely read into memory both the current
filebucket contents and the new contents. This doubled the amount of ram
needed when checking if the new contents were the same. Instead of
reading in the entire contents, we can instead work from streams and use
the FileUtils.compare_streams method.
(Maint) Convert uses of IO.binread to P::FS::File

Now that we have Puppet::FileSystem::File we can start using it in more
places and start getting rid of some of the monkey patches that puppet
has been doing.
(Maint) Deprecate (Puppet::Util|IO).binread

IO.binread is a monkey patch, which makes it inherently bad.
Puppet::Util.binread is a trivial implementation that can be handled by
callers instead of us holding onto this in a library.