Changed the FileReaderWriter class to a factory based implementation

The more I thought about the FileReaderWriter implementation the more I thought it was an example of stringly typing (only with a enum). I really think it is a bit of a code smell so I refactored it into a Factory-based implementation.

This maintains the ability to specifiy a single factory class that generates readers and writers (see the SequenceFileReaderWriterFactory class). The standard way to implement would be to provide the reader and writer implementation as nested classes as I have done with the existing SequenceFile and DelimteredTextFile ones.

I've made all the tests pass, but I'm sure there's some cleaning up to do. I just wanted to show it to you early to see what you think.

Unavoidable its a big PR, but the main entry point is: src/main/java/com/pinterest/secor/io/FileReaderWriterFactory.java

All changes cascade from that. The nice thing about this is you have the intialisation method directly on the factory, so implementers know exactly what to implement and the type system enforces this. The only reflection is to create the factory (which requires a parameterless constructor).
Arguably the FileReaderWriterFactory is the more fundamental object. You may want to call this method and cache the factory rather than calling the other methods.

I introduced createFileReader and createFileWriter, because it made it much more tractable to do the refactor rather than changing all of the modules using these methods to first obtain a FileReaderWriterFactory.

That said if you'd prefer to have a single entry point then I can do as you suggest. If you wanted to be able to obtain both FileReaders and FileWriters in the same piece of code then it would make sense to keep GetFileReaderWriterFactory public