Decouple apiserver from codec implementation

The apiserver on initialization must be provided with a codec for encoding
and decoding all handled objects including api.Status and api.ServerOp.  In
addition, RESTStorage objects may now optionally implement Extract() or
instead rely on the codec to decode for them.

NOTE: Only the last commit is new, the other commit is in #806
Instead of doing it this way, I'd suggest replacing the Extract() method with a New() method which just returns a new object of the type that the RESTStorage object expects. Then apiserver can call DecodeInto, which will do any necessary conversion (hence allowing your RESTStorage object to use whatever version of the type it wants). Extract() was always a poor man's version of Decode/DecodeInto.