more strict arg processing in single_or_multiple
more strict arg processing in single_or_multiple

Since commit a77a7894 solvers support solving multiple residuals for multiple
targets. The `single_or_multiple` decorator pre- and post-processes the
arguments and results in case the solvers are called using the old syntax. Currently it is allowed
to pass a mixture of single- or multiple-style arguments to solvers, e.g.

    newton('target', [residual], ...)
    newton(['target'], residual, ...)

This commit makes the argument processing more strict: if the target is a
`str`, not a tuple of `str`, then all arguments with annotation `integraltuple`
must be not tuples as well. Similarly, if the target is a tuple, then all
arguments with annotation `integraltuple` must be tuples as well.

wijnandhoitinga/nutils