You have a couple of things going on.
First, is opposition reflex. When dogs feel tension on a leash they pull into it. If you allow the leash to become tight, your dog will pull by instinct. You mentioned that you went through three sets of classes, I'm guessing group classes?
You also wrote:
I should also add that he doesn't listen to easy commands on walks like sit, down. I usually have to wait a good 10-20 seconds while he just stands there ignoring my existence until he complies. Not sure if this is just an age thing or if I need to increase training sessions.
This is your other problem. No offense intended, please don't take this the wrong way, but your obedience is really lacking. A dog should be allowed to go 10 - 20 seconds before obeying a simple, basic command like sit. Why would you wait so long? Why not take some enforcement action?
When my dogs understand a command, like sit, down or come they have 2 seconds to perform that command. If they have not performed the command with in 2 seconds, they are simply being disobedient and need to be made to perform the command. I do not repeat commands, everything is back and white with my dogs. If I say "sit" the dog has to sit with in 2 seconds. There seems to be a lot of grey areas with your dog and you allow him to decide when he is going to obey your commands.
The upside is the this is very easy to fix. The problem is with you and your training and management. Your dog knows that he really doesn't have to obey your commands in a timely fashion and you tolerate it. You need to up your obedience, get better focus and engagement from your dog and be much more consistent. As I said, this is a very easy thing to accomplish. You really need to take a more proactive approach and make obedience fun for your dog, while instilling firm, fair and consistent rules.