Update to aggressively remove unused sections

This turns on the more aggresive compiler features - every function
and data object are split into their own section which allows the
linker to do aggressive reachability analysis and drop everything
that's unused. This should reduce program size to the minimum
possible.