optimize update performance

Instead of handling each incoming screen update (or other server
updates) in one Invoke, operations are enqueued and when the invoke
occurs, the entire queue is drained in one task.