Add basic support for interceptors

@JakeWharton @jhump @swankjesse 
I guess it really depends on how many interceptors in the majority case will a message pass through. If that number is one, then we should keep the message objects themselves. By the time we get a hook for the interceptor to run the caller has created an immutable instance already. We'd lose nothing by passing the mutable builder even if the count is only one but we gain the simple and clean functional pipeline aspect feel with the immutable instances otherwise.