Remove static initialisation based registry.

Instead, do things the old fashioned way and include them via
ifdefs. This solves a problem which is caused by having static
initialisers in library (ar) files where the linker can see
they're not called directly and elides them.

We retain the ability to add backends on the fly, because this
will be useful for testing purposes.
Split backends off into their own libraries.