So perhaps this is happening:
show_toast() is being called to show a toast, then very soon after hide_current_toast() is called to hide that same toast.
Occasionally, the hide_done_cb() callback is called *before* show_done_cb(), when usually it should only come after.
That makes me curious as to how glib iterates through the list of callbacks.