Allow client and server to vary the API versions they use

Handles storage version setting on apiserver, and client version
specification.  Uses the appropriate codec for the version specified.

Open problem: needs to merge data when PUT uses an older version

Only the last two commits are new
Yeah, a single map (or function in latest) is definitely better than maintaining a bunch of switches all over the place.