What's the best practice to avoid collisions in throwaway temp tables?
The standard approach in Oracle is that global temporary tables are first-level objects.  They should be created at install time when you create all your permanent tables.  Doing DDL at runtime is very much frowned upon.  I'm not sure how this increases maintenance or how it makes stored procedures "no longer wholly self-contained"-- you don't need to do any maintenance on a temporary table and stored procedures presumably already have references to tables so I'm not sure what problem adding a reference to a temporary table creates.

It is unusual, though, in Oracle to use a temporary table in the first place.  I've been developing in Oracle for years and I can count the number of temporary tables I've created there on one hand.  Perhaps you would be better served by a collection of some type.  Perhaps you just need a view that implements whatever logic you're using in SQL Server to populate the temporary table.  Perhaps you want a pipelined table function.  Perhaps you even want a materialized view.  It will depend on why you're creating the temporary table to begin with.  Here is another thread that talks about alternatives to temporary tables in Oracle in more detail.