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).
I would prefer to keep the acl in sync with the current code structure and lean on the conservative side. This applies specifically to internal code that is not part of a public API. Marking this method as private immediately tells me that it is not invoked from outside of this class which is a useful piece of info. If we ever need to change that (it is not clear to me that we will be touching this piece of code any time soon), we will with not regrets (again because it is an internal piece).