Several JsonProvider improvements

* When the RootName parameter is not specified, use "Root" instead of "Entity" as the default name (closes #316)
* Reuse types in JsonProvider (closes #354)
* Improve json error messages to include full path (closes #151)
* Don't generate empty choice types
* Give more general names to heterogeneous types
* Some refactoring to optimize the generated code to be smaller
* Fix unused variable warnings

When starting to do #354 I had a bit of yak shaving to do because the heterogeneous types kept references to the property names in the generated code, so I had to refactor that out, and in the process included the full path to be able to do #151.

I'll still remove the `Path` property out of IntelliSense and add tests for #151 before merging, but would like @tpetricek and @rickasaurus to have a look at the difference in the generated types. In particular, in the GitHub sample, Project and Background were united to the same type, but I think it's not too bad, given the improvements elsewhere