Handle counts were readable through get_node but absent from update_node, and
create_edge took no handle arguments — the server always picked. Expose both,
and close the two backend gaps that opening them up would otherwise turn into
silent link loss.
- create_node/update_node take top/bottom/left/right_handles and
show_port_numbers; create_edge and a new update_edge take
source_handle/target_handle.
- New list_edges: get_canvas slims edges down to id/source/target/type/label,
so the handles an edge sits on were unreadable through any tool.
- Clamp handle counts to 0..64 on every write path (create, update, canvas
save). The renderer clamps at draw time, so an unclamped row drew a
different node than it stored.
- Port the canvas store's shrink remap to the node PATCH route: an edge left
on a handle that a count reduction deleted silently stops rendering.
Closes#435
ha-relevant: no