toscho's answer is correct as to the technical reasons to define your CPT in a plugin, but it seems to me that much of you question stems from a misunderstanding of the template hierarchy. Almost, but not quite, every template file that you've seen is optional.
With the exception of the basic index.php template file, Theme
developers can choose whether they want to implement a particular
template file or not. If WordPress cannot find a template file with a
matching name, it skips down to the next file name in the hierarchy.
If WordPress cannot find any matching template file, index.php (the
Theme's home page template file) will be used.
http://codex.wordpress.org/Template_Hierarchy
WordPress will use the particular specialized files if they exist but fall-back to another file-- ultimately index.php
-- if there are no specialized files. Your theme does not have to implement anything special to deal with or compensate for your plugin's CPT's. The theme can but does not have to.
- Assuming I've enabled
has_archive
I still need to create archive-cpt.php
, right?
No. archive.php
will be used and if that fails then index.php
- Also: In order to display the CPT I need to create a custom loop, so I still need to create
single-cpt.php
...right?
Again, no. Same reason. single.php
will be used and if not index.php
.
- And these files need to be created in the theme, right?
Yes, but they are optional. You don't need them at all.
- If I disable the plugin: I still have to remove (or hide or something) the
archive-cpt.php
and single-cpt.php
pages.
No. You don't need to do anything. The templates will not be used.
- If I switch Themes: I still have to add those two pages into the new theme. Right?
Wrong. The templates are optional. You only need them if you want a customized display for the post type.
When you understand that the theme and the CPT are not as intimately connected as your question make it seem, then some of the other logic should make a bit more sense.