There are lots of good comments, but I don't see one particular issue addressed: is your (verbal) agreement essentially a fixed-price contract or an hourly-rate contract?
If you negotiated an hourly rate for your time, then you are essentially performing a staff augmentation role and your output is a work-made-for-hire that belongs to the client.
On the other hand, if you negotiated a fixed-price contract (one price for the whole thing regardless of your effort), then you essentially have NOT produced a work-made-for-hire and you have options for what you give to the client.
As many have already said, it is CRITICAL that you identify and adhere to the legal conventions in your jurisdiction. Consult a lawyer if feasible, but at least do some research and consult your peers in the area.
If you have the legal option, I would provide the source code based on a DOCUMENTED non-exclusive license for the client's unlimited use and modification, but where you retain exclusive copyright with all its privileges. Fill the source code with copyright declarations, add copyright and license text files with the appropriate verbiage, and provide a complete copy of the package to the client.
If necessary, give the client what they want and use this incident as a learning experience. If you include the appropriate copyright declarations and license texts in the package, then you don't even NECESSARILY need to directly discuss this issue with the client--it is unlikely that it would ever be an issue if they have the source and you have the source and you each pursue your own interests with it.