Major Call Arity rework

This patch improves the call arity analysis in various ways.

Most importantly, it enriches the analysis result information so that

when looking at a call, we do not have to make a random choice about

what side we want to take the information from. Instead we can combine

the results in a way that does not lose valuable information.

To do so, besides the incoming arities, we store remember "what can be

called with what", i.e. an undirected graph between the (interesting)

free variables of an expression. Of course it makes combining the

results a bit more tricky (especially mutual recursion), but still

doable.

The actually implemation of the graph structure is abstractly put away

in a module of its own (UnVarGraph.hs)

The implementation is geared towards efficiently representing the graphs

that we need (which can contain large complete and large complete

bipartite graphs, which would be huge in other representations). If

someone feels like designing data structures: There is surely some

speed-up to be obtained by improving that data structure.

Additionally, the analysis now takes into account that if a RHS stays a

thunk, then its calls happen only once, even if the variables the RHS is

bound to is evaluated multiple times, or is part of a recursive group.