@Ronan You really want to get a (pdf-) copy of Maple's Programming Guide. You can download it from Maplesoft's support pages, specifically, this page has near the bottom a link to the Programming Guide:
It answers most of your questions (and some you didn't even know you had).
Some easy answers: Yes, you can have a variable number of parameters. You can set defaults for each one. You can use Null as a parameter value when you call a function or procedure. The Programming Guide explains all of that.
As for your types; I have written packages that define and use their own types. So I know the scheme Carl proposed (with the AddType statements in a ModuleLoad proc) works. Make sure you are calling ModuleLoad(); before the end module statement. The module definition and ModuleLoad() can appear anywhere, I think...
I am not sure about your use of the "uses" clause. AFAIK, you just say "uses TypeTools" after which TypeTools is added to the list of namespaces that get searched. In other words: your equation in uses may not work. Personally, I get around such bother by using fully qualified names everywhere in my packages (i.e. TypeTools:-AddType()). Yes, more typing when writing these packages, but much easier to debug & trouble-shoot.
I hope this helps,
Edit: Replaced some redundant remarks.