[Dexter] Add support for aggregate expects in the debugger
Allows aggregate expects to be written in Dexter scripts, in the form:
!value expect:
member1: 0
member2:
submember1: 1
submember2: 2
This uses the "variables" feature provided in the DAP interface to
recursively fetch sub-variables from each evaluated variable, and modifies
the DebuggerExpectMatch class to also be recursive, containing submatches
for each expected aggregate member value.
Some key concepts that are affected by this are the "match_result", which
has changed from a bool to a 3-way result ("FALSE", "TRUE", "PARTIAL"),
where "PARTIAL" means that at least one submatch was TRUE and at least one
was FALSE. We also add a `match_distance`, which is used as a measure of
correctness. The match distance ranges from 0.0 to 1.0: a total match has a
distance of 0.0, a total mismatch has 1.0, and a partial match's distance is
equal to the average distance of its immediate children.