Replace the usage of "names" for storage with "ids"

Ala http://issues.hibernatingrhinos.com/issue/RavenDB-1140

**This isn't quite ready for merge yet**, but it could definitely do with some review while I'm still on the project (I'm off on Monday for a couple of weeks)
 
### Todo

- ~~I need to convert the storage itself to use integers~~
- ~~I need to optimise look up by name (currently O(n))~~
- need a migration path
- ~~rename PublicName back to Name so as not to break everyone's code!~~

### Working thoughts

Migration is pretty much the only thing left, and It'll need to do an in-place migration of the data in several steps

- Write a test
- Assign ids to each index in IndexDefinitionStorage
- Re-serialize those index definitions with the new ids
- Go through each index definition and replace the "key" in Esent with the ids rather than name
- Convert each Esent key into an integer by modifying the table structure

I am unsure whether Esent will support this sort of in-place migration, but that's something to play with isn't it!

### Implementation description

- I changed Name into an integer, and went *everywhere* to make everything that could use this new id, use this new id
- I added a PublicName property as a string, and everywhere that was public facing, made it use this instead
- I created lookups so names could be converted into ids at the point of query for example
- I made all disk based storage use the id
- I made all esent based storage use the id
- I made all managed storage use this id
- I then generated this id at index creation time by seeing what the maximum one we have is and returning +1
- I removed compiled indexes as it would be a PITA to do a lookup from name to id as they're not serialized to disk
- I renamed Name to Id since that is what is is now
- I renamed PublicName back to Name as it means no breaking change there
- There is probably a better way than that, but it works