Fix AbstractFlowSet.intersection.

It wasn't doing intersection. It would be nice to have an abstract
implementation of FlowSet backed by a java.util.Set, which delegates
union / intersection / difference to addAll / retainAll / removeAll,
instead of this mess.
Clean up DefinitelyAssignedAnalysis.

Use HashSetFlowSet of the superfluous AssignedFlowSet, and move to
natlab.toolkits.analysis.core, removing the defassigned package.
Handle "implicit defs" in ReachingDefs.

Previously, assignments to array elements, struct fields, and cell array
elements were all considered defs, e.g. x(i) = 5 was a def for x. These
are usually uses; the reason they were defs is that all of them can
implicitly define the variable is that variable didn't exist previously.

With this commit, these three are only considered defs is the target
variable was not definitely assigned at that point. (ReachingDefs now
runs DefinitelyAssignedAnalysis as a first step.)

Also fix the UD/DU chain construction to take this into account.
Clean up: unnecessary copies, unused imports
Factor out common AST predicates and functions.
Add methods to get uses and defs for a stmt.

Not sure if these belong in ud / du chains, but it seems a convenient
place to put them.
Refactor RenameVariable using new ud/du methods.