Add basic support for interceptors

@JakeWharton @jhump @swankjesse 
Just FYI:

The reason the first stab we did at this functionality was designed this way was to minimize/eliminate any performance impact that interception would have. If you require interception to be triggered by an option, then the code generator can omit the interception hook points for messages that have no options and no extension ranges (e.g. statically known that it can never trigger interception).

I know Wire works very differently in that it doesn't generate serialization and de-serialization code, and that serialization and de-serialization rely on reflection. So this likely isn't a performance concern in that context, since adding another hash map look-up is negligible compared to the other work it's doing.

Just some insight in how the API this is based on came to be.