Today I finally managed to get to the bottom of this issue, the problem was two fold.
1) QEMU was not obeying the request to disable the PS/2 stream from devices when the guest want's to scan/identify them. If you were moving your mouse or typing when the guest attempted to perform an identify it could cause the stream to become corrupted and the guest would stop trying to use the device.
2) QEMU did not perform proper bounds checking on the PS/2 input buffer, if it overflowed half way through a multi byte packet, the remaining bytes would be discarded, causing the guest to get out of sync with the stream.
I am pleased to announce the following patches that correct this behavior: