TODO List
------------------------------------------------

o) Instead of assumeing upgrade or restore, the program should query all avaiable build identitiys and find which ones are valid, if more then one is valid then display a menu asking whether to resore or upgrade. (This would also benifit users by cacheing both upgrade and restore SHSH blobs to sauriks server so users aren't stuck with only being able to upgrade or restore.) (in progress...)
o) Also img3 should be updated to be able to fetch tags from each image such as the VERS tag to be able to compare with the current iBoot version. 
o) Need to add 8900 file support into img3.c. 
o) Cacheing TSS and activation info locally so the program doesn't need to query apple/cydia servers everytime would be nice. 
o) Need to add support to handle and display status messages correctly. 
o) Writing restore logs to an external file for debugging would be a great help. 
o) Would be nice to add options to keep some connections open during similar operations rather then reopening and closing them each time. (in progress...)
o) Extracting and signing all firmware files at one time rather then extracting and signing each one as we need it could speed things up as well.
o) Double check restore_send_kernelcache()
o) Clean up and refactor restore_send_nor()
o) Finishing cleaning up asr_perform_validation
o) Double check asr_send_payload()
o) Cleanup dfu.c/dfu.h
o) Cleanup recovery.c/recovery.h
o) Cleanup normal.c/normal.h
o) Cleanup restore.c/restore.h
o) Cleanup tss.c/tss.h
o) Cleanup img3.c/img3.h
o) Cleanup ipsw.c/ipsw.h
o) Make ipsw.c a proxy to tss.c and img3.c
o) Make all components only have access to their own context instead of a single global application context (less coupling)