I didn't realize Binder had the transaction ID semantics you mentioned.
It might be worth mentioning that Binder allows the callee to identify the caller's UID and PID. Since Android gives each application its own UID, this is sufficient to implement a relatively sophisticated security policy.
Also, since Android 2.0, bionic supports mutexes and semaphores with PTHREAD_PROCESS_SHARED. (It's just futexes, after all.) So you can roll your own zero-copy solution if you're so inclined. As best as I understand, Binder always does one copy, so if you're passing an enormous amount of data, you might want to do this.