Add function to return mechanics expressions as strings.
Use % syntax for string formatting to fix test.
Fix incorrect % string formatting usage.
upgrade solving for abs, powers, and real/imag variables

Also:

    use powdenest before factoring in _tsolve

    fix detection of difference of functions
add bivariate solving to solvers
edits after coverage check
modify preprocessing for lambert
remove use of match from _tsolve

XXX not sure why the ode test_linear_coefficients changed
add symmetric lambert detection
use deep option with factor
remove some indeterminism from solve
update ode tests
make trig rewriting more robust in solve
2830: add more aggressive testing to checkodesol
use logcombine in _tsolve
modify doctests and tests for ode
try avoid recursion in _tsolve

Before these changes a hash-dependent failure would occur:

didn't have recursive error in drv_types.py doctest
    architecture:       32-bit
    cache:              yes
    ground types:       python
    hash randomization: on (PYTHONHASHSEED=380265779)

did have recursion error:
    architecture:       32-bit
    cache:              yes
    ground types:       python
    hash randomization: on (PYTHONHASHSEED=1110671673)
3845: remove indeterminism in constsimp

also implement a more compact passing of args in constantsimp

unfail tests that now work in test_ode.py
use force with solve in dsolve

A marked test generates a PolynomialError since
the general quartic solution cannot be returned
so the PolynomialError is now caught in the try.
solving of trig functions gives 2 (of infinite) solutions

The solving of trig-related frunctions is no longer treated as
a simple inversion in the case of sin and cos so that multiple
solutions are now returned. wester tests have been un-XFAILED to
reflect this change.