codec: support cbor format; improve extension and streaming support.

The high level changes:
- cbor support
- Improved extension support
- Streaming support (indefinite length array/map/string/bytes) for cbor, etc

cbor format has gained traction as a binary format. It is specified by IETF,
and is used in constrained devices and many other places (see cbor.io).

To support cbor, we needed to redesign the way we handle Extensions and include
Streaming support, while ensuring that Encode/Decode can be called multiple times
on the same Encoder/Decoder.

The support for cbor is comprehensive.