I'm going to define "small work or hobby project" as something that, in its initial form, would consumer maybe 10-20 hours of work at the most.
Generally I just start writing code. I come up with a good nickname (so later I'll remember what this strange code is) and use it to name the main program file.
Then I'll start off with a block comment and brainstorm what I want to accomplish with the program, and prioritize features. This is where the scope is determined, but it's a sliding scope - since I've roughly prioritized features, then I can simply stop work at any time and have a subset of the features done.
Then I'll just start in.
Most of the implementation details, library choices, etc are determined on the fly depending on the expediency of the work. Since it's a personal project, however, I'll often reinvent the wheel because it's fun, and I don't have to worry about licensing issues.
Your other questions really only apply to projects that take longer than 10-20 hours (a week or two). For projects where there's 20-100 hours of work, I'll sit down and create a formal document with the concept, main features, time estimates for each feature, etc. If I don't then I'll lose my place when my attention leaves the project for a week or month, and I'll get stuck in small issues that I really should just push past (because I want to keep to schedule)
This also improves my estimating abilities.
Prototypes are built when I can't accurately estimate time required for something, or to prove a concept critical to the project before embarking, but as prototypes often turn into projects I try to develop the prototype in a way that won't limit me later if I do use it to jump-start the project.