Explicitly use a specific protocol for a delegate.

I think it's safe to assume that you always know the protocol of your
delegate. This means we don't need to *search* for method signatures,
we know exactly where to look for them.

This also makes sure that we can't reach the case where an incorrect method signature is accidentally used. (e g, if there is both -(BOOL)foo and -(float)foo, -[searchAllClassesForSignature:] could pick up either one, with potentially a crash if the wrong one is chosen).