How to create large progmem arrays and not annoy the linker
Include Guards only protect against inclusion of a header file multiple times within the same translation unit.  This is important.  If you include a header file (1) in a source file, then include another header file (2) in the same source file, said header file also including the previous header file (1), then the include guard will perform its function.

If you have two source files and you include the same header in both, then the include guard will do nothing.

If you have a variable or function defined in a header file and you include that header into two different source files, when you link those source files together you will get a multiple definition error, since you have two translation units that have the same thing in them, and the linker doesn't like that.

The only time you should ever define variables or functions in a header file are if they are simple constant types, like a const int or a const char - something where the compiler can replace it verbatim in the code and optimize out the symbol completely (arrays of any kind are not simple), or if the symbol is declared "static", where it will be forced to remain "within" the translation unit and not get exported for linking.

Normally you will only declare your complex constants in the header file, and define them once and once only in a single source file. That way there is only one instance of the symbol in one translation unit.

For example, in the header file you would declare your constant:

extern const char foo[] PROGMEM;


And in your source file define the constant:

#include "foo.h"
const char foo[] PROGMEM = {0xDE,0xAD,0xBE,0xEF};


And in answer to the question "what's the difference between #include &lt;...&gt; and #include "..." - when it comes to Arduino, nothing whatsoever.

Officially it denotes a separation between "system" and "local" headers. That is, headers that are installed in the OS as part of the compiler, and headers that are contained within the project.  However there isn't that distinction with Arduino, and the two mean the same thing - just a header.

And finally a note on terminology - a glossary if you will:


Translation unit - One compilable source file (and any included headers) that forms a single file of object code to be linked. 
Declaration (Declare) - The indicating of a symbol's type and any attributes, but not the content of that symbol
Definition (Define) - Associating a symbol, whilst declaring it, with the content of that symbol.
Symbol - the name of any variable, function, class, etc.