BiConnect.connect executes a bidirectional connection element-wise.
Note that the arguments are left and right (not source and sink) so the
intent is for the operation to be commutative.
The connect operation will recurse down the left Data (with the right Data).
An exception will be thrown if a movement through the left cannot be matched
in the right (or if the right side has extra fields).
See elemConnect for details on how the root connections are issued.
This function is what recursively tries to connect a left and right together
There is some cleverness in the use of internal try-catch to catch exceptions
during the recursive decent and then rethrow them with extra information added.
This gives the user a 'path' to where in the connections things went wrong.