A node whose FUNCTION points at a method that does not exist (e.g. a typo
in a custom node) raised an AttributeError inside the scheduling heuristic
(ux_friendly_pick_node -> is_async). That exception escaped
stage_node_execution() and the prompt worker's error handling, silently
killing the worker thread with nothing reported to the client.
- is_async() now treats a node whose FUNCTION does not resolve to a method
as non-async, so scheduling proceeds and the missing-method error is
raised and reported through the normal execution path.
- stage_node_execution() wraps node picking so any unexpected scheduling
error is returned as an execution error (attributed to an available
node) rather than propagating and killing the worker thread.
Add regression tests covering both paths.