Avoiding Viper functions in hashsets and as keys in hashmaps
I recently saw a Viper program where some consistency checks that need the call graph between functions took literal minutes, because various parts of the code calculating that graph use Viper AST functions as keys in maps. So lots of operations have to compute the hash code of those functions, which is apparently not cached in Scala's generated hash code implementation for case classes. And if the functions are sufficiently complex, this can apparently take forever.
So this PR just changes that code to compute maps from function names to sets of function names, instead of directly mapping functions to sets of functions.
This requires simple adaptations in Silicon and Carbon, which need to be merged first.