Allow inlining of JsonCodec#encode (#13814)

JsonCodec#encode() is a frequently called (hot) method. However in its
current form it is too long to be inlined.

This review reduces the length of the method from 454 bytes instructions
to 311 and optimises flow of common calls.

It however has a behaviour change for esoteric edge cases where the
order would matter. Like a custom collection which extends JSONArray and
implements collection. Previously it would have been handled by the
collection case, now its the JSONArray case. However it can be assumed
that the result: serialized to valid JSON is the same.

Change-Id: Ia552eec6322d0760581336b8b038fa03761c1d69