Issue 4009: Fix predicate detection in simplify_logic.

Previously, simplify_logic would assume all free symbols were predicates, and
would construct a truth table based on results of substituting True/False for
each.  This would sometimes result in incorrect simplifications when Boolean
structures were made containing other expressions.  Now, it takes anything
that is not a BooleanFunction as a predicate, then simplifies the predicates
before reassembling.
Add optional simplify parameter to simplify_logic.

Specifies whether to apply recursive simplification to predicates contained
within the boolean function being simplified.
Use xreplace instead of subs in simplify_logic.

Subs had an issue where one predicate of a boolean function was contained
entirely within another predicate of a boolean function (eg. predicates x,
and x+1).  The smaller predicate would sometimes be substituted before the
larger, causing the larger to not be substituted, and potentially causing
the simplification to produce incorrect results.  This appeared to happen
on only some invocations of the interpreter: the added test would sometimes
pass and sometimes fail.

Xreplace instead searches for all predicates simultaneously, matching the
largest predicate that it can in any expression, thereby preventing this
issue.
Merge pull request #2451 from Tempel/4009_simplify_logic

Issue 4009: Fix predicate detection in simplify_logic.