use json.Number internally, to handle both int64 and float64

This defers the actual parsing of the text value to the numeric type
until you dereference it using the Int(), Int64() or Float64()
receiver methods.

This has the benefit that large integers (>= 1e6) are not marshaled in
floating point exponent notation, and that very large integers (>=
2^53) do not lose precision when marshaled because they were stored
internally as float64s.