Regarding #3, if your app is connecting to an external service (ie: your own back-end app running in your own server), you can always create a free package, but charge for the account running in your server. You ask your customer to create a free trial account on your server, install a free Salesforce package, and then disable the account on your server after the trial has expired if the user does not want to purchase premium service.
Having said this, this is my personal opinion: the above only makes sense if your external application is storing or manipulating data for the user in a way that couldn't be done in Salesforce. If you're doing this just to be able to charge for our app bypassing the AppExchange, it's bad commercial practice and will give you some technical headache (there are some design limitations when connecting to an external service, especially around callouts and DML).