After three rounds of redesigns and input from the client they
should be happy with what you've done.
The reason to charge a percentage up front is that it's sort of a retainer. They pay you to show you that they honestly want your services and aren't going to make you work, take the final product, and never pay you. It's like a deposit or a down-payment.
If you don't know how to do what the client wants, then why'd you accept the job, I'd say. If something's over your head, say, "I'm sorry, but this project isn't going to fit into my schedule (or some bullshit), but I want to recommend some people who might be better suited to what you're looking for."
Naturally, you should have a fairly detailed "this is what you're getting" in your contract - "an HTML/CSS website, 20 pages hard coded, no content management" for example. That way, you can't say, "OK, I'll do this site for $1500." and then sign the contract and get to work - they call you a week later and say, "actually, we need you to add an ecommerce system in for the same price."
Your contract and their downpayment is mostly to protect you from being abused by the client. At the same time, you must make them happy and only take on jobs that are within your skillset - if you don't (that is, if you piss them off, create substandard work, or take on something that is out of your league) then you'll lose not only that client, but future clients as well.
It's said in sales quite often that if a customer has a good experience, they tell 1 person. If a customer has a bad experience, they tell 10 people.
Best to make their (and your!) experience a good one.
Either way, make sure your contract covers everything. Amount of work to be done, expectations, revisions allowed, etc. That way the client can't fuck you over without risking a lawsuit.
Sorry if this is rambling. I've been at the bar.
