Don't scan all statements on each hit -- there may be very many of them

If we store the statements in a hash-map by id, then we can do a hash lookup when matching invocation ids to statement objects, rather than a "find" which needs to scan all statements.

This takes my test run (`sbt scoverage:test`, without a "clean") from 3m22 to 1m28. This number may overstate the improvement; I haven't done very many tests.