" further improvement in restoration of the &updatetime. To make this
" usable in the plugins, we want it to be safe for the case when
" two plugins use same this same technique. Two independent
" restorations of &ut can run in unpredictable sequence. In order to
" make it safe, we add additional check in &ut restoration.
let s:Pecho=''
fu! s:Pecho(msg)
let s:hold_ut=&ut | if &ut>1|let &ut=1|en
let s:Pecho=a:msg
aug Pecho
au CursorHold * if s:Pecho!=''|echo s:Pecho
\|let s:Pecho=''|if s:hold_ut > &ut |let &ut=s:hold_ut|en|en
\|aug Pecho|exe 'au!'|aug END|aug! Pecho
aug END
endf

In this form, I think it's safe for use in plugins.

I have noticed this too and used a similar approach to create a list of messages that should be put out at the end of command execution, but didn't think of using CursorHold. An alternative simpler solution is to put an extra newline at the end of the message such that the second empty line gets overwritten instead of the actual message, however this causes a Press Enter prompt (if the 'cmdheight' is 1).

*:echo-redraw*
A later redraw may make the message disappear again.
And since Vim mostly postpones redrawing until it's
finished with a sequence of commands this happens
quite often. To avoid that a command from before the
":echo" causes a redraw afterwards (redraws are often
postponed until you type something), force a redraw
with the |:redraw| command. Example: >
:new | redraw | echo "there is a new window"

This seems to be solving my problem so far without having to kill any kittens with your script.