Make adjoin into a protocol.
Make adjoin into a protocol.

This paves the way for other types (eg protobufs) providing
optimized implementations of adjoin.

flatland/useful,jafingerhut/useful,amalloy/useful