I noticed you are capturing the block into a `Proc` variable but not using it.  Capturing the block like this has a perf cost; see this conversation thread:

https://github.com/rspec/rspec-core/pull/1057#discussion_r5932247

That said, I noticed in the definition of `receive_messages` that you raise an error if a block is passed, but that will only get triggered if the block is passed with curlies -- if it is passed with `do/end`, it'll get passed here instead.  For consistency, it should raise an error in both cases if we're going to bother with the error at all.

You know, I think you can get by with just using `block_given?` there (and here) to avoid the cost of reifying the block.