bus: implement message_read_ap() non-recursively

As it turns out if you pass a va_list to a function its state becomes
undefined after that function returns, and this actually does break on
x86-32.

Hence, let's reimplement message_read_ap() without the use of recursion.
Instead we now build our own stack of types in an array so that we can
decode the entire parameter list in a single stackframe.