The existing picking implementation has several problems:
1. It's synchronous, but crosses thread boundaries.
2. The data used to find the nodes that intersects with the picking ray are ephemeral (per frame).
3. With overlapping views only one of the views will work (ephemeral data differs between views).
For the first two items there are two possible solutions. The easiest solution would be to make the picking async, meaning picking is done on the render thread and the result from the picking is sent back through a callback. The second solution is to build up the data need for picking and separate it from the frame data, some synchronization mechanism is most like going to be needed unless we can work purely on the data from the front-end nodes.