Fix some confusion over the behaviour/purpose of IsSameProgram

Creates a new method similar to IsSameProgram called
IsDuplicateProgram which is purely used for scheduling purposes.

The issue seems to be that IsSameProgram() doesn't do what it appears
it should. Places using it assume that it will match two
programs which are identical - same content - but it's been modified
over time to serve the definition of a 'duplicate' for scheduling
purposes. This means, among other things, that if the duplicate check
method is 'None', then IsSameProgram will return false given two
identical programs.