Json changes

Prepares the way for the new JHM implementation

Adds some helper functions to \<base/json.h>. Also improves performance considerably by reducing the number of copies, and improves error messages slightly.

There is a slight functionality change in the Match() helper. It now is more accurate with matching things (Before it was overly greedy in eating full tokens, which would occasionally cause it to eat an important comma as well).
I'd rather be explicit about the construction of the temporary here. Why it was being wrong here before is because operator=(TJson, TArray) was overloaded for copy only, not move. This forces the move construct of the TJson object, then explicitly makes that a temporary, which will naturally be moved by TJson's operator= from TJson objects.

If I just left this at std::move(temp), I'm not sure which would win / I don't know the lookup precedence rules for the move constructor for TJson then calling move assign operator, or treating the temporary as an operator to TJson(const TArray &), both of which are feasible behaviors.