Hey OakTestUser,
I'm just starting to get my head around the Oak also, as I haven't had time to follow it's progress or delve into its depths... so is quite possible I've gotten a few things wrong

I think as far as the reference to 'just a regular program' may be a bit misleading, as the firmware is able to update both itself, and the user program. Erik posted this in a recent comment about the Oak in regard to another discussion, which might help aid in filling in some of the blanks:
An Oak has 3 rom slots, one holds your Config rom, one holds your User rom (what you upload), the other is empty. When you upload a new User rom or a new Config rom (due to an update), it goes to the empty slot and once confirmed complete and good the pointer to that rom is changed to point to that slot.The memory addresses which you are specifying are the addresses that the Oak's MCU is expecting to find those ROM programs. It is different to other ESP based boards as Erik has divided up the memory into those slots. As you can see from where you were mentioning "oaksetup_restore.bin" and "oakupdate_restore.bin", you are filling these two slots with those two default programs - one which set up the oak, and the other being the system updater. The memory addresses are probably only relevant to the bootloader, as it should be the only code that is operating at that low a level. I think there are a few other slots we'll find about as the documentation is updated, which hold the unique device id's for the Particle Cloud (at 0x100000 and 0x201000).
Regarding serial programming, it is indeed possible. You change your upload settings (under Tools -> Upload) to"Serial (Expert Use Only - Requires Python)". However, I believe you then lose OTA programming until you restore the stock firmware. However, it would upload significantly faster, and is a possible workaround to using an Oak until the setup process becomes more reliable.
ELF stands for Executable and Linking Format, and apart from be able to store fuse values and EEPROM data when used for the Arduino boards, I believe it also contains the the final interpreted version of your code, as well as the assembly version. It's main use is for being able to run your code through a debugger or simulator if one exists.
Pete