solidified distinction between directed and undirected edges

this is not a presentational attribute, as it conveys semantic value
added support for node relations (i.e. graph edges)
ensured multiple edges can exist between node pairs
added code coverage using Blanket.js

http://migrii.github.com/blanket/

note, however, that CoffeeScript makes interpreting coverage reports
somewhat awkward and cumbersome

NB: due to same-origin policy issues, this requires the test suite to be
accessed via HTTP (e.g. using `python -m SimpleHTTPServer`)