Changed the implementation of RequestReply

When sending a request we now add the callback action to a request
configuration object.  The object is then stored in a dictionary along
with the correlationId.  When receiving the reply the message handler
looks for the request configuration object in the dictionary, if one is
found it executes the callback action method and then cleans up resources.