How do I smooth a subdivided surface?
I think the best way is to build this mesh again. Here is my solution on how to do it properly:


Add a low poly (8 vertices for example) cylinder and subdivide it as many times you like verticaly/ horizontaly. 





Select single edge and press Shift+S--> Cursor to Selected.





Press Alt+Shift+S and move the cursor from left to right (or input a value 1). It will make the edge spherical.





Repeat the proces with other edge loops. Select the next one and press Shift+R. Make all of them spherical and then cut the holes.





Delete half of the cylinder and scale it in y axis using proportional editing. Now all look super smooth.