I looked at the code, and it seems sensible, but I was wondering if we care about the efficiency of detecting cycles. Are AliasMaps going to be big? I get the impression that cycles are supposed to be an indication of a (hopefully) rare bug state, so it shouldn't matter that we walk through the cycle up to N hops to report a cycle in an N-sized map. Is this true? If so, then we don't care too much about efficiency, but we might put a comment saying that yes, we could get by with less hops if we're willing to do more bookkeeping, but it's not worth it in this case.
Otherwise, great job, looks pretty clean.