graphcycles: keep nodes in a vector + move user_data out of it
graphcycles: keep nodes in a vector + move user_data out of it

This improves cache locality.

Note that user_data currently has no callers, so accessing it
quickly is not something we want to optimize for.

name                          old time/op  new time/op  delta
BM_StressTest/2048             474ns ± 1%   492ns ± 1%   +3.63%  (p=0.008 n=5+5)
BM_StressTest/4096             490ns ± 1%   497ns ± 1%   +1.52%  (p=0.008 n=5+5)
BM_StressTest/32768            504ns ± 1%   508ns ± 1%   +0.86%  (p=0.032 n=5+5)
BM_StressTest/262144           553ns ± 1%   557ns ± 3%     ~     (p=0.548 n=5+5)
BM_StressTest/1048576          617ns ± 2%   616ns ± 2%     ~     (p=0.690 n=5+5)
BM_ContractEdge/1000           121ns ± 2%   104ns ± 6%  -13.56%  (p=0.008 n=5+5)
BM_ContractEdge/10000          147ns ± 1%   119ns ± 1%  -18.86%  (p=0.008 n=5+5)
BM_IsReachableNonConst/10     10.4ns ±35%   9.3ns ± 6%     ~     (p=0.310 n=5+5)
BM_IsReachableNonConst/50     15.8ns ±12%  15.4ns ±10%     ~     (p=0.841 n=5+5)
BM_IsReachableNonConst/100    17.4ns ± 6%  17.5ns ±13%     ~     (p=0.841 n=5+5)
BM_IsReachableNonConst/200    19.7ns ± 6%  19.5ns ± 6%     ~     (p=0.690 n=5+5)
BM_IsReachableNonConst/1000   25.2ns ± 4%  24.9ns ± 6%     ~     (p=0.690 n=5+5)
BM_IsReachableNonConst/30000  49.8ns ± 4%  44.3ns ± 5%  -10.98%  (p=0.008 n=5+5)
