From what I have seen the underlying mechanics for multiple table support are already there. We just need to make all the places that assume there is only one for convenience, stop doing so.
DatabaseDescriptor parses and stores the results of the config xml. Right now the shortcut for "get the table name" is DD.getTables().get(0). I suggest auditing the calls to getTables() and see if any are actually using it for more than that. (I don't think there are.) Then start fixing them. When you are done, get rid of it so nobody is tempted to be lazy like that again.
There are two classes of fixes. Client API fixes and internal uses. The client ones are probably easier in general. What should happen is, the client gives cassandra a table name as part of any API call, and that is passed to one of the handler methods (e.g., ReadVerbHandler, RowMutationVerbHandler). Those will have the table name as part of the Command object they read off the wire. So just start including the table name down the call stack.
The internal ones are a bit harder but only a little. Often an object will need the table name in a place where its caller does not know the table either, e.g. ColumnFamily.getColumnComparator. Here you'll need to add an instance variable containing either the table name or a reference to the parent Table object. Adding factory methods to Table such as Table.getColumnFamily may be convenient.
Some of DatabaseDescriptor itself needs to stop assuming only one table. This will not be much code. applicationColumnFamilies_ is one place. at the very least that needs another layer of Map<tablename, appCFs> like tableToCFMetaDataMap_ does. If you're more ambitious you could try moving those into the Table object as additional cleanup.
Please leave any questions here in case anyone else wants to help.