Its an interesting idea.
Pro is that it could enable flexibility in the way the language is extended, as you have mentioned.
Con is that I am not sure how much benefit this offers over simply composing shared protocols. Where it does make sense, I am not sure whether it really saves much - for example, you could have a 'cancel' macro, but it would need to be supplied with the (1) main normal flow, (2) the condition for cancel (i.e. an interaction) and (3) the cancel flow. However this is not much different from simply using the try/catch block with the related information.
So I think its an idea to be explored, especially if it offers benefits in a particular domain, but we need examples that illustrate the limitations of the current notation and the benefits of the proposed extensions (along with other alternative ways of solving the same problem).
I think that is generally the best way to evolve the language - driven by examples that highlight the limitations, and show the alternatives.