Optionals Refactoring & Fixes

* Move optional property from InferedProperty to InferedType to reduce the number of possible invalid states that can be represented. Added checks for the other ones
* Increase test coverage and mark code paths ont covered with a comment
* Fixed handling of optional records in JsonProvider (fixes #163)
* Reduced the number of cases where heterogeneous types are used in JsonProvider (fixes #69)
* Fixed <type> option option being generated on some cases in JsonProvider and XmlProvider (fixes #352)
* Treat "", null and missing values in the same way in JsonProvider (fixes #66)
* Fixed homogeneous arrays to have the same null skipping behaviour as heterogeneous arrays in JsonProvider
* Fixed handling of optional elements in XmlProvider (fixes #351, #353)
* Fixed CsvProvider generating column names with only a space