decode: use HashDict literal in test
Remove copypasta from consume_array_contents

In cf074aed92c49768184afbb721e4686700426acf, I accidentally copied
a String parsing block into the case statement inside
consume_array_contents.
Refactor decode

All helper methods now take a { any, binary } as their first argument.
They pass this around, keeping the memoized value in the first position
and the remaining JSON to parse in the second.

Converted some multiple definitions to case statements since Elixir
cannot match inside the string in a tuple.
Refactor Hex: use an attribute for valid hex chars
JSON.Hex -> JSON.Numeric

Hex.to_integer/1 -> Numeric.to_integer_from_hex/1, which now obeys the same
contract as String.to_integer/1
consume_number/1 -> Numeric.to_numeric/1

Move number parsing to JSON.Numeric.to_numeric/1, which obeys the
general contract of String.to_integer/1.
decode numbers with exponents