Better error reporting during Firmware Upgrade

Previously you didn't get good errors back from the bootloader open/sync stage. Now you will get exactly what went wrong in that stage as well:
- Modified qextserialport to return actual OS errors from open/read/write
- Changed QGC to only attempt bootloader open once after port is found to be available. This allows us to be more specific with errors that happen during this stage. Trying the open multiple times wasn't accomplishing anything other than hitting the same failures more than once.

This change should close all the gaps as far as an error occurring during firmware upgrade without a specific error being displayed. This should help us debug any issues much more easily.