Use make_boot_image() for all Zebu tests

Due to the fact that we didn't have make_boot_image() in early development, currently the tests are written in different ways for code generation and linking:

  1. use compile_to_sharedlib() (as exposed in API, but not in the Mu spec) to link generated code to a dynamic library
  2. use make_boot_image() (as exposed in API) to link generated code to an executable
  3. use compile_fnc() to link generated code to a dynamic library for cargo tests
  4. manually compile code, persist vm, and link for cargo tests

Currently 1 and 2 are internally using make_boot_image(). But others are not. Since make_boot_image() in Zebu allows generating dynamic library or executable (depends on output file name), we can make all the test use make_boot_image(). This will make the linking for all tests unified, and make it easy to make changes.