Allow looping task definitions

Stop following subtasks when a duplicate task is found. Leave the
duplicate task mostly empty, set its status to "DUPLICATE", add a task
hint indicating the duplicate, ignore any pass/fail criteria and treat
these criteria as if they had not been defined. Make the new "DUPLICATE"
status behave similarly to a "PASS" status so that it does not block its
ancestors. Since duplicate tasks have no subtasks, task loops are
prevented from looping infinitely, all while making loops harmless and
still making it discoverable that a loop has been encountered and where.

Change-Id: Id0bf27ce267e88e0213082adc089cf0754d139ff
8 files changed