While MasterTickets updated the custom fields blocking and blockedby to include dependency information,
it is not in a form that can be used to reliably build a graph of dependant tickets. This adds support
for getting PM values from external relations such as the mastertickets table.

For now this is only used for predecessor/successor but it could be expended to parent/child (e.g.,
using SubTickets plugin's subtickets table) if needed in the future.

If A has children B and C, and D has children E and F, if A is required
for D then B and C have to be completed before D.

This copies predecessor and successor dependencies down the tree before
scheduling so those dependencies can be honored by the scheduler.

It uses functions as objects and takes advantage of the fact that the
accessor functions don't return values, they return references to the
original lists so those lists can be updated without more complicated
access wrappers to append, remove, etc.

Also fix a bug in creating milestone pseudotickets where [] and None
were not used consistently with the rest of the module.

Any scheduler will need a fast lookup of tickets by ID so this takes the
work of building that lookup off the schedulers, reducing duplicated
code.

It also copies the ticket attributes so that the scheduler can change
them without concern that it will break things. This enforces the pre-
and post-conditions for computeSchedule() that only 'calc_start' and
'calc_finish' are set/changed.

When working forward to build an ASAP schedule, partial takes caused the
tasks to shift forward more than their scheduled length.

If one resource can work 8 hours per day and another can only work 4,
the second resource takes twice as long to complete the same task. But
without this clean up, ALAP scheduling took an 8-hour task at 4 hours
per day from the end of day 2 to the middle of day 1. With this change,
if all available hours are used up, the rest of the day is consumed so
that 8-hour task goes from the end of day 2 to the start of day 1.