Properly queue up messages for removal, and then remove from all bindings at once. Before this it was possible for a message to be removed from one binding and then get "stuck" in other bindings as it was already marked as removed.
Before this you could get a message "stuck" by:
Open a file
Trigger a message on the file
Split the file so there are two instances open for it
Trigger a second, new, message in the file
Fix both messages
Note that the initial message is still showing for the second view on the file
Properly queue up messages for removal, and then remove from all bindings at once. Before this it was possible for a message to be removed from one binding and then get "stuck" in other bindings as it was already marked as removed.
Before this you could get a message "stuck" by: