I found the problem (which was two-fold).
First I was setting the x and y members of the new Point class, not the X and Y.
Second, the script I referenced used row.shape = p to change the shape, while I was using row.setValue( "Shape", p). In my case, this caused a crash because Shape was not part of the UpdateCursor field, so I added Shape as a field. This now executes as expected.
Why not a better error message when attempting to set a field via an UpdateCursor where the field was not selected?
Why the difference between Point.x/Point.y and Point.X/Point.Y?