Data path for driver: secret of 'node_tree.'
When creating a driver with the property set to material, you're implicitly using a reference to an object of type bpy.types.Material.

Your first attempts in step 2) and 3) didn't work because bpy.types.Material has no attribute called node. The idea in step 4) has the same problem as the previous attempts, because the driver tries to access these attributes in the material object of type bpy.types.Material and since there is no bpy.types.Material.bpy this fails as well.

The correct way to access the nodes is indeed through node_tree since that is an attribute in the object of type bpy.types.Material. It gives you access to all nodes in the referenced material.

Attempt 6) fails again because there is no shader_nodetree in bpy.types.Material.node_tree.

For questions like these you can always consult Blender's Python API docs.