Why does the receiver have to be the same person that gets the callback? What if you want to loan ETH to address X but callback to address Y?
Why not allow the caller to decide the callback and provide all of the parameters? They already can query for fee, and the amount being loaned is known to the caller in advance of the call. So you could just do receiver.call(_calldata)
which would allow the caller to also decide what method was called.