internal/v4: implement archive uploading

We don't yet verify bundles against charms in the store.

This required some refactoring of the testing code;
the most important change is AssertJSONCall actually
makes a real HTTP call through a socket, as that
allows us to correctly test the ContentLength logic.
It also gives us greater assurance that the logic
will work over a real HTTP connection. The overhead
seems to be negligible.
+1
This can be made more readable like:
verifyConstraints := func(string) error { return nil }
// TODO: provide a real constrains verifier.
if err := b.Data().Verify(verifyConstraints); err != nil {
...