preserve node data on update (i.e. d.x, d.y, d.px, d.py, d.fixed)

merge new nodes with old nodes via `merge()` before setting `force.nodes()`
.
refactor +parsing.py +Graph.py +Edge.py +printing.py

move parsing helpers from `parse.py` to `parsing.py`
(splitting `parse.py` into `parse.py` API and its dependency `parsing.py`)

`graph.py` => `Graph.py`
module/class is capitalized
object imported/instantiated is lowercase

`edge.py` => `Edge.py`
keep `@edge` stuff
move graph stuff to `Graph.py`

transparently migrate (i.e. with "import *") all printing stuff
from `util.py` to `printing.py`
(why? like util (~ your own stdlib), printing should be easy anywhere)
refactor `Parsed`

`(line, cst, ast, graph, head, parser) = Parsed()`

refactor `parsed._` to `parsed.graph._` for `edges` and `nodes`
Revert "refactor `Parsed`"

This reverts commit 4e9f2c3459ecf5cee796db5473c1b2dc8d2e9c53.
Revert "Revert "refactor `Parsed`""

This reverts commit bf9902022e72012ec85be5266b0ad0c1007b5611.
highlight on hover!

when hovering over an edge, or after clicking it, focus on and select the line of text that made that edge

Edge : {line: Line}

Line : {line: str, lineno: int, file: str}

`notes.read` : str => [Note]
 where Note : [Line]
groups text into notes and numbers lines

`parse.edges`

`parse.parse`
: str => [Parsed]
highest API

`curl -d '{"\n"}'` for json with multiline strings

<textarea>  v  [contenteditable=true]
val()  v  text()
scroll  v  ?

`unselect()`  undoes  `select(line, stay=false)`

`select()`
~> string.split()
~> elem.focus()
~> elem.selectionStart
~> elem.selectionEnd

`logic_edge_to_visual_link()` : _ => {lineno: int}

`yield from` ~> python3

+ types . - builtins
eg. tuple => Edge
eg. py[label, *nodes = edge] => [edge.label, edge.nodes]

`self.__dict__ = {}` in `Edge.__new__()` -> `Edge` : mutable