This fixes a bug where we couldn't upload voice messages because the audio buffer was being read, therefore changing the position of the cursor. When this happened, the upload function would claim that the buffer was empty and could not be read.
This makes it easier to keep track of which pieces the client will have already dispatched or been executed, reducing the amount of class members needed.
Critically, this makes it so the 'stop' button (which is currently a send button) actually works even after the automatic stop has happened.
UI is still pending for stopping recording early. This is not covered by this change.
See diff for details. Note that this introduces an "Uploading" state which is not currently used.
At the moment, if a user hits the maximum time then their recording will be broken. This is expected to be fixed in a future PR.