So this has to be the responsibility of the reply sending backend in the end: to create and release the DSM *at some point*.
What's wrong with just releasing it at the end of the statement? When the statement is done there's no point to reading it asynchronously anymore.
That was only one of the problems in signals-based design, and it has other more significant problems. The current approach does exactly that: allocate the segment before running the plan, release at the end of the statement.