Stepping through the lines individually by themselves would not show you what is going on, you have to take apart the statement that is giving you the trouble: in this case, Show[p1, p2[1,1]. By themselves, neither p1 nor Show should give you trouble, which leads to the conclusion that it must be p2[1,1]. This is born out by running that by itself, which generates the same error.
This generates an error because of how Plot, Plot3D, etc evaluate the function argument. In general, they essentially do a Replace on the text of the function and may not expand function calls. A simple fix is to rewrite p2 as
p2[x0_, y0_] := Plot3D[Evaluate[p[x, y, x0, y0]], {x, 0, 2}, {y, 0, 2}]
which gets rid of the errors. Evaluate ensures that function is evaluated symbolically before Plot3D gets a hold of it avoiding any mishandling. I wish I had a better idea of when to use Evaluate in these cases, but if in general if you are getting errors from a plotting function like these, then it is most likely mishandling the function.