construct FunGraphs

Take inputs and outputs which are of classes ToFunGraph (heterogenous lists of Expr a)
and traverse the outputs reifying all expressions and creating a hashmap of StableNames (stable pointers).
Once the hashmap is created, lookup the provided inputs and return a FunGraph which contains an
expression graph, input/output indices, and other useful functions. StableNames is non-deterministic
so this function may return graphs with more or fewer CSE's eliminated.
If CSE is then performed on the graph, the result is deterministic.