Rewrite GRAPH tests for new graph type.

This sets up a structure where we essentially test a particular
signature.  There is a functor which tests the functions of the GRAPH
signature on a suitable graph.  We then use this to test the GRAPH
signature function of the Graph, OGraph and BangGraph variants of our
graph type.

Note that this already caught a case where the Graph version of a
function (delete_edge) was correct, but the OGraph version was not (it
threw the wrong exception if there was no such edge).