Things to note on creating a Salesforce managed package in a free developer org:
1. Namespace cannot be changed! And once it is taken, it cannot be used in any other orgs.
Look at this 10 years old Idea: https://success.salesforce.com/ideaView?id=08730000000BqjiAAC
2. Plan well on global classes, methods, and webservice methods, variables, because they cannot be deleted, their names cannot be changed, their names are visible to clients, and clients can reference them in client code.
However you can deprecate global classes and methods, but you cannot deprecate webservice methods and variables.
Even if you deprecate global classes and methods, clients can still see their name in your code, but at least the deprecated codes cannot be referenced in client’s code anymore, while, deprecated items can still be referenced in the package.
You can deprecate an interface but you cannot deprecate individual methods in an interface.
You can deprecate an abstract class but you cannot deprecate individual abstract methods in an abstract class.
You cannot remove the deprecated annotation to un-deprecate something in Apex after you have released a package version where that item in Apex is deprecated.
3. Visualforce pages cannot be deleted or renamed.
Encapsulate as much code as possible, only expose code in well-chosen classes, methods, and pages names, this will leave you great flexibilities during code refractory.