Use JSON enum to help with type inference

This branch is suppose to speed up compile time by using an `enum` to describe the JSON.
hmm well actually this might not work ... JSONDecodable makes you implement the decode function that takes a `JSONValue` and returns the class optional ... in all cases I don't want a JSONValue optional back from decode