Experiment with more granular interfaces

Pursuant to #4 

looking at this makes me wonder if it might be good to simply demolish the type-level distinction (on the `Graph` interface side) between different edge types. the cost of doing so would be preserving the exact Edge object that's passed in, though.