For every "rockstar" programmer there are many more "average Joes" and I think that's ok. I'm a "jack of all trades, master of none" type person too, mainly because I like learning about many things but haven't spent enough time in any to become the expert (but I'm getting there). My advice is to find a field that seems interesting and jump in. Figure out who the expert programmers are, what makes them great and emulate them. You only stay average if you choose not to learn and grow.
Seems like you are hurting yourself by not getting a job. Yeah working for "the man" isn't as fun as running your own business. However, there is a lot to be said for getting experience in the real world and taking responsibility for your loans. You should be able to find a job easily with web dev and graphics.
While most popular penetration testing books only scratch the surface of the topic, they are still a good resource for beginners. "Gray Hat Hacking" is on it's 3rd edition and offers of good intro into many tools of the trade. http://amzn.com/0071742557
I've been programming in the aerospace/defense industry for 5 years now. For me, programming has stayed fun because I get to work on interesting problems and see the fruits of my labor when a new product gets built and certified. My biggest piece of advice for people is keep learning and find something new when you get stuck in a rut, never settle!
I definitely agree with the authors "Lack of a Programming-Centric Career Path" points. I recently ignored my gut and took on a management/leadership role. It's good experience and the "right career move" but it's not what I wanted at this time. Anyone wanting a programming career should read "Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman".