I think all those options sound good. We could support coins via a plugin API; we'd define a plugin that communicates with *coind's raw transactions API via RPC. A user who doesn't want the disadvantages of option 2 can switch to option 1 for one or more coins by running their own local *coinds.
Besides extensibility in supported coins (which is important since new coins can arise quickly), a plugin architecture allows for multiple backends for a particular coin, i.e. local bitcoind/SPV/electrum depending on the user's security/resource usage tradeoff.