I’ve already explained twice what it’s for. The Plane has to be defined in some sort of coordinate system. A Plane is not a scene graph object, so it has no meaningful coordinate system. That’s why PlaneNode is used to put it into the scene.
A Plane is comparable to a Point3 object, in a way; it holds a mathematical description of a point, but it doesn’t really specify in what coordinate space the point is, so you won’t know whether that point is relative to the camera, render, the player node, or any other node.
But when you apply it to a node, it suddenly makes sense - for instance, when you pass it to nodePath.setPos, you’re telling Panda that this point is relative to the parent of that node.
To elaborate, your Plane object holds the normal vector and origin of your water plane. But what are this normal vector and origin point relative to, to which node? The only way you can answer that in a meaningful way is by allowing one to put a Plane into the scene graph, which is what PlaneNode is for. For instance, if you reparent your PlaneNode to render, you can say “OK, so the normal vector and origin points of this plane are relative to the coordinate space of render.”
As for your StateInitializer question: well, when the other camera renders the scene for the reflection, it needs to render it a bit differently than normal. For one, instead of rendering the front faces, it should render the back faces, since it is rendering a reflection.
Secondly, it only needs to render geometry that is above the water plane, and not below. This is done by setting a clip plane attribute.
(NB: this is especially where the PlaneNode comes in; Panda requires a PlaneNode here because it needs to know in what coordinate space your Plane is. So, to reiterate: you can not avoid using PlaneNode, there is no reason to, and it would not make sense to.)
All of this information (clip planes, reverse culling) is held by a RenderState object, which in turn holds a number of RenderAttrib objects for individual attributes (ColorAttrib, ClipPlaneAttrib, TextureAttrib, etc).
The RenderState object is held under the PandaNode, and its attributes are what actually gets modified when you use setColor or setClipPlane or setAttrib.
Anyway, so to render the same scene differently using a different camera (with these different properties), setInitialState is used. This means that all of the nodes rendered by that camera will default to having the attributes specified by that RenderState. This ensures that when the reflection camera renders the scene, it is rendered using these different attributes (but you can still override individual attributes on a per-node level).
Now, you could create a RenderState object and add the appropriate RenderAttrib objects to make the desired state, and pass that to setInitialState. But the RenderState API is quite low-level and not easy to use. So we need a high-level wrapper around this RenderState that allows you to easily specify these attributes, and then get the underlying RenderState to pass to setInitialState.
But we already have this high-level wrapper, which is NodePath. So, we create a new node called StateInitializer (the name is unimportant), and using the NodePath interface, we set these attributes like the clip plane and CullFaceAttrib.
Then, get the underlying state object using getState(), and pass that to setInitialState.
As for why the CardMaker does not suffice: CardMaker exists to make two triangles to describe a visible, renderable quad. On the other hand, the Plane object is like a mathematical formula to allow you to calculate the reflection of a transformation (using getReflectionMat), which you need for calculating the proper matrix for the reflection camera (see next paragraph).
As for what the setMat call does: in order to be a reflection camera, it needs to be on the opposite side of the water plane; if the normal camera is two metres above the sea level, then the reflection camera is at the same point but two metres below the sea level.
Multiplying the transformation matrix of the camera by the reflection matrix of the plane mirrors it over the water plane, resulting in a new transformation matrix that can be applied to the reflection camera.