Reorganize build a bit in preparation for EFI

We should leave generation of final output to the platform rather than
always creating a raw binary, as that is not appropriate for some
platforms. EFI needs to create a PE executable instead. Also, make all
final binaries get placed into build/<target>/bin