Organize IndexedSet

* Remove random selection - this should be from the user
* Add elementAt function for random access
* Organize functions
Added Edge type

* Added Edge type
* Adjacency lists contain Edges, not just target
* Added Spire to constrain edge weights to Ring
    * More generic path cost computation

TODO: Implement graph creation/add edges to cover the possibilities of
{ undirected, directed } x { unweighted, weighted }