Why the change from `caller[2]` to `caller[3]`?  Is it always `caller[3]` regardless of which way the message expectation is set (e.g. `should` syntax vs `expect` syntax vs the new APIs added in this PR?)

Regardless, this seems very brittle. I'd rather it do something like `caller.find { line| !line.include?('lib/rspec/mocks')` or something.  Thoughts?