Changed from accepting null formatters to using null format object(s). This makes more formatter implementation classes (at least when formatter is not needed for reading/writing), but I think it's still the best option. Adds more type safety without needing additional file read and write methods.
Refactored, fixed some documentation, added validation to FileService.