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'll revert this one, the ones below are needed to make the end-to-end tests work so i was thinking they should be left in. For example kafka.socket.receive.buffer.byte. I can remove them too if you like