Add view to return product listing as jsonp [MS-624]

I was planning on styling this on the microsite side.

Both of the following examples use the same url, but with different Post-a-Job objects available: `/postajob/list/?site=3&callback=foo`

If a given SeoSite doesn't have any SitePackages, Products, or ProductGroupings, the following is returned:
```
foo("<div>\n    \n        <p>There are no products configured for purchase.</p>\n    \n</div>")
```

If the SeoSite has all of them, something like the following is returned:
```
foo("<div>\n    \n        \n            <div>\n                <strong>Title</strong>\n                <p>Description</p>\n                <ul>\n                    \n                        <li><a href=\"https://secure.my.jobs/postajob/product/purchase/add/1/\">Product with Name</a></li>\n                    \n                        <li><a href=\"https://secure.my.jobs/postajob/product/purchase/add/2/\">30-day job posting - $10</a></li>\n                    \n                </ul>\n            </div>\n        \n            <div>\n                <strong>Title 2</strong>\n                <p>Description 2</p>\n                <ul>\n                    \n                        <li><a href=\"https://secure.my.jobs/postajob/product/purchase/add/1/\">Product with Name</a></li>\n                    \n                </ul>\n            </div>\n        \n    \n</div>")
```
Which renders as
![2014-07-15-134329_251x269_scrot](https://cloud.githubusercontent.com/assets/3379265/3603829/acd549cc-0d1a-11e4-8d64-b9be2ff91199.png)

All tests pass.
I think you can pass in a generator expression, which would make the list comprehension brackets reduntant:

```python
products = itertools.chain.from_iterable(site_package.product_set.all() for site_package in site_packages)
```