I think there is merit in making vec3 be a strict subset of functionality provided by nearly every other linear algebra package and the analogous classes built into various graphics languages and toolkits. This would allow users to easily substitute an alternate implementation that they might prefer -- one they are already using in other projects, or one in common use at their company, or one they previously wrote themselves.
There are currently a few minor impediments to this in the class as presented: the write_color(std::ostream &out) method, and later the vec3::random() methods. Those can perhaps be moved out of the vec3 class and into standalone functions.