Use a more natural swap_ack implementation

I find myself unable to explain how it worked before, but now the renderer
sends a message when it finishes a frame, and the device will receive on this.
We use a `SyncSender` so that it will block if it tries to send more than the
configured amount of frames.