Allow phutil_render_tag() to accept an array content argument

Summary: D4509 converted some `phutil_render_tag('x', array(...), $x.$y)` to `phutil_tag('x', array(...), array($x, $y))`, but we don't currently support this. Support it, since it makes conversions easier.

Test Plan: Fixes some issues in the `phutil_tag` branch, like `PhabricatorPropertyListView`.

Reviewers: vrana

Reviewed By: vrana

CC: aran

Differential Revision: https://secure.phabricator.com/D4640
Make pht() return PhutilSafeHTML when passed PhutilSafeHTML?

Summary: See D4645 for discussion. I think the alternative is a ton of `phutil_escape_html(pht(...))`.

Test Plan: Unit tests.

Reviewers: vrana

Reviewed By: vrana

CC: aran

Differential Revision: https://secure.phabricator.com/D4646
Implement `array_fuse()`

Summary: We've been bitten by the behavior of `array_combine()` on empty arrays in PHP < 5.4 several times recently. Implement an alternative for `array_combine(x, x)`.

Test Plan: Unit tests.

Reviewers: btrahan, chad, vrana

Reviewed By: btrahan

CC: aran

Differential Revision: https://secure.phabricator.com/D4657
Add function calling nl2br() and phutil_escape_html()

Summary: It will reduce number of `phutil_safe_html()` callsites.

Test Plan: None.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D4706
Provide array_interleave()

Summary:
This tackles the specific case of:

  phutil_render_tag(
    'div',
    array(),
    implode(' &middot; ', $list_of_stuff));

...replacing it with:

  phutil_tag(
    'div',
    array(),
    array_interleave(" \xC2\xB7 ", $list_of_stuff));

While we could continue using implode(), that means we can never get rid of the __toString() call.

Test Plan: unit tests

Reviewers: vrana

Reviewed By: vrana

CC: aran

Maniphest Tasks: T2432

Differential Revision: https://secure.phabricator.com/D4682