In this PR we address the dual issues of the ELF container the firmware is read from being thrown away too quickly, and the guessed load address being wrong on parts that have the firmware start at someplace other than 0x08002000.
To address this we introduce a new FirmwareFile type and FirmwareStorage trait that allows bmputil to transparently hold firmware backed by an arbitrary file type and which knows how to determine, when available, the load address a file is intended for. This is then promulgated through to BmpDevice::download() to allow it to more smartly determine load address.
The introduced ELFFirmwareFile type that implemented the FirmwareStorage trait holds onto significantly more information about the ELF that was read in w/o discarding it, thus allowing the actual load address of the firmware to propagate properly. This type also implements proper loading of segments in a manner more conducive to correctly loading the firmware into Flash on the target even in the face of arbitrary section names appearing. It fills gaps between segments with the erased byte to create a contiguous firmware image.
There are still a bunch of assumptions being made that need addressing, however this unblocks us enough on hardware bringup and allows bmputil to be successfully used with other platforms such as Blackpill which also use a different firmware load address.
NB: This change may break ABI, however it does so on functionality that should never have been exposed to the world. Hopefully the new visibilities for the new functionality is set correctly in relation to that.