Here is some information for those like me that are content to just read memory.
The GUID for the transport is currently stored at offset -8 from the x value for mobs and players (i.e., in 3.1.1, x is at 0x798 and the transport GUID is at 0x790).
At least for mobs and objects that act as transports, there is a 4x4 float matrix used to compute the final position of everything on said transport. It is stored at [currObj+0xf3c]+0x10 for mobs and at currObj+0x1a8 for objects, again for 3.1.1.
Calling T00 to T15 the array elements for the matrix in the order they are stored in memory, OX, OY and OZ being the position you read from memory for the mob/player that is in the transport, and X, Y and Z the real position:
X = OX*T00 + OY*T04 + OZ*T08 + T12
Y = OX*T01 + OY*T05 + OZ*T09 + T13
Z = OX*T02 + OY*T06 + OZ*T10 + T14
As for the facing, it is just the sum of the transport facing (read in the usual way) and the player/mob facing.
This has been tested and found working with the tournament mounts, the ships flying over the same region and the tram.