The Gantt chart passes a bunch of options that come from the macro
invocation or the chart configuration in Trac.ini. A lighter weight
client -- like the ticket change listener -- may not have all those
options and just wants default behaviors. Some missing values weren't
handled as defaults before.

This defaults to disabled (0) and can be controlled by useActuals option in
the TracPM section of trac.ini (1=use actual dates, 0=schedule). The
useActuals parameter to the Gantt chart macro overrides the TracPM value.

TracPM.start(), .finish() now return calculated date, then stored date, then None depending on what is available.

postQuery() now reads schedule from private table rather than having it queried from custom fields

When the rescheduler is done calculating a schedule it uses INSERT or UPDATE to write only changed tickets back to the private schedule table.

Changes to the schedule are stored in the schedle_history table.

This handles inserting initial schedule into DB and updating only changed tickets when rescheduling.

With the changes to TracPM.start(), .finish(), a caller (e.g., the Gantt chart) can:

Query tickets

Optionally schedule them

Iterate over them getting the start and/or finish dates

If the scheduling step is skipped, the dates from the database are used.

There's a potentially inefficiency in how potentially inactive tickets
are found. We might get this set by first getting all the affected
tickets then following the predecessor links from the goal but there
isn't a function for that yet and preQuery() is fairly efficient. I
don't want to optimize prematurely.

For this to work, I have to splice the in-memory ticket graph based on
ticket changes.

This has some gross code that is specific to plugins we use and makes
TracPM less portable but I want to prove this works before trying to
make it generic.