Extract some duplicated query building logic and add support for multi-level link queries

Eliminates the duplicated handling for IN clauses as well as a few other bits, and in the process got multi-level links close enough to working that I just went ahead and finished it.

@alazier @jpsim 
Any tests to make sure object identity works with multiple key paths? Would also be nice to have test for nil for multi-keypaths.