binary: take array length from type. save an int

- arrays' lengths are encoded within the type.
- don't encode/decode in/from `io.Reader` and take the length from the type.
- save a varint.

admittedly, this change is more controversial as it breaks backward-compatibility.