Cache EdgeData.{source,targets,weights}, to optimise neighbours 10% (#886)
Cache EdgeData.{source,targets,weights}, to optimise neighbours 10% (#886)

Using a `@property` that calls down to the `._column` method (which itself does
a dictionary look-up) adds a non-trivial amount of overhead for retrieving
neighbours, which don't do much other work than ask for these
properties. Instead of providing them as computed `@properties`s, we can just
cache the look-up as a stored property. This cuts ~10% off the neighbours
benchmark, and 4-10% off the random walk benchmarks.

(Median times, in microseconds)

| benchmark                                                    | develop | this PR | change |
|--------------------------------------------------------------|--------:|--------:|-------:|
| `test_benchmark_get_neighbours`                              |     628 |     562 |   -10% |
| `test_benchmark_biasedrandomwalk`                            |     330 |     297 |   -10% |
| `TestBreadthFirstWalk.test_benchmark_bfs_walk`               |     445 |     412 |    -7% |
| `TestDirectedBreadthFirstNeighbours.test_benchmark_bfs_walk` |     800 |     738 |    -7% |
| `test_benchmark_biasedweightedrandomwalk`                    |    1590 |    1662 |    -4% |

stellargraph/stellargraph,stellargraph/stellargraph