Refactored to use templates and allows vectors to be read from settings into a std::vector container

This pull request involves refactoring the code to use templates & specialisation, instead of overloads, which reduces code duplication, and allows easier changes to be made.

The switch to a template based system was chosen to allow reading of comma separated strings into a vector (which type is determined by the user). It also allows writing of vectors to the file.

(Now with only one commit!) :)
Hmm, I don't understand how a change would result in inconsistent behaviour... It's not the same with primitive types.
Right now, if you pass in a vector with more elements than there are in the file, you get a vector back that is filled with some new data and some old data. As a user I would expect that if I pass a vector in it's either untouched or filled with new data. Everything else seems unintuitive to me.
The above behaviour doesn't happen with primitive types. Actually I find it inconsistent the way it is right now.

I don't want to use the return type, because passing the reference in offers the nice advantage of letting the user set default values. If the key is not found the reference remains untouched.
```cpp
int width = 800;
settings.get("width", width);
// if no key "width" is found in the file, the variable width is still 800
```