Add basic support for interceptors

@JakeWharton @jhump @swankjesse 
Interceptors are run in the same order for serialization and deserialization.

Suppose I have two interceptors: LoggingInterceptor (logs messages) and UpgradeInterceptor (copies data around to make API migrations easier). Suppose I want to log the raw data sent to/from the network. I think that means LoggingInterceptor will print the non-upgraded messages on the way in (good) but the non-downgraded messages on the way out (bad).

The fix is to run interceptors in one order on deserialize and the opposite order on serialize.