codec: re-design implementation of fast-path functions.

Now, all short-circuit functions are stored in fast-path.go.
They are also registered in maps.

At encode or decode time, we also check if there is a
dedicated reflection-bypassing func for a given slice or map type,
and use that in place of the generic kMap or kSlice.

It simplifies encode and decode because they do not have to
explicitly know and call shortcircuit functions again.

Also, map/slice encode/decode grabs encFn/decFn for key/val/elem type just once.
This effectively bypasses some reflection calls,
only doing it once, instead of each iteration of its collection.

Also, include gen-fast-path.go to auto-generate the fast-path.go file.
Design fast-path.go so it can be excluded (for smaller lib/binary) using a +buid ignore.