Bring the design of InsertInvoker closer to the other invokers.

It's not entirely the same because there are insert methods which take
another query or expression, so we cannot compile to SQL up-front. Instead
we compile to an Insert node (using only the special compileInsert phase
instead of the full query compiler) and wrap it in a client-side mapping.
This gets passed to the InsertInvoker which can then call the
InsertStatementBuilder (and the driver's selectStatementCompiler when
inserting from the server side) for the final compilation step.

Of course, we also use the new typed AST for the converters instead of the
old linearizers.
Remove dependency on linearizers from constraint handling and templates.

Index/constraint handling used to rely on linearizers for getting a list
of referenced columns. Instead we now use the Shape to pack() the original
value, grab the packed Node and extract the linear sequence from that
(which can be done independently of the Shape -- see
ExtraUtil.linearizeFieldRefs).

QueryTemplates not only do not need the linearizers any more, they can
even be unified with QueryInvokers (so that a QueryInvoker[P] is simply a
QueryTemplate[Unit, P]) with the additional unit invoker mix-ins.