Replaced the shared signature cache by an instance-local one

Because the main purpose for this class is to act as a stand-in for a delegate, and delegates should conform to protocols, we can lookup the method signatures in the protocol.

This also solves the edge case where a protocol contains a method of the same name as some other type, but with a different signature, which might otherwise lead to data corruption.

LIMITATIONS:
Currently, the helper function only looks up the optional instance methods in the protocol.
This can be extended pretty easily.
Adopted the changes to the proxy’s designated initializer in the tests.
Fixed a three BAD_ACCESS crashes due to improper variable usage.

1. The for-loop in CopySignatureCacheForProtocol() assumed a nil terminated list, which we don’t have in method_description_list.  
Fixed by using a loop counter and shifting the pointer arithmetic into the loop’s body.
2. AppendMethodsFromDescriptionsToList() wants to edit the list, but struct parameters are passed by value, so the original list was never updated.
Fixed by changing the signature to using a pointer to the method list.
3. When returning early from the initializer, dealloc is called but `_cache` is NULL, which CFRelease isn’t too fond of…
Fixed by adding a safeguard against NULL for the cache.
`conformsToProtocol:` now returns the truth for the protocol that this proxy has been initialized for.