Given a function `fn` and a time in milliseconds `delay`, return a debounced version of that function.
A debounced function is a function whose execution is delayed by `delay` milliseconds and whose execution is cancelled if it is called again within that window. The debounced function should also receive the passed parameters.
### Expected Behavior:
If multiple calls occur within `delay` ms, only the last call should actually execute.
Example 1:
Input: calls = [10, 20, 30], delay = 50
Output: 30
Explanation: Only the last invocation with argument 30 executes after the 50ms delay window settles.
Constraints:
0 <= delay <= 1000
Calls can be invoked synchronously in rapid succession.